This is a discussion on Re: Merge algorithms for large numbers of "tapes" within the pgsql Hackers forums, part of the PostgreSQL category; --> > -----Original Message----- > From: Tom Lane [mailto:tgl@sss.pgh.pa.us] > Sent: Wednesday, March 08, 2006 3:17 PM > To: Dann ...
| |||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| ||||
| > -----Original Message----- > From: Tom Lane [mailto:tgl@sss.pgh.pa.us] > Sent: Wednesday, March 08, 2006 3:17 PM > To: Dann Corbit > Cc: Jim C. Nasby; Luke Lonergan; Simon Riggs; pgsql-hackers@postgresql.org > Subject: Re: [HACKERS] Merge algorithms for large numbers of "tapes" > > "Dann Corbit" <DCorbit@connx.com> writes: > > Here are some suggestions of things that I know work really, really > > well: > > #1. Two pass merge (none of that silly poly-tape merge goo) > > This amounts to an assumption that you have infinite work_mem, in which > case you hardly need an external sort at all. If your work_mem is in > fact finite, then at some point you need more than two passes. I'm not > really interested in ripping out support for sort operations that are > much larger than work_mem. No it does not. I have explained this before. You can have one million files and merge them all into a final output with a single pass. It does not matter how big they are or how much memory you have. The idea is very simple. Each subfile has its top record inserted into a priority queue of file handles (or whatever else you want to use -- temp tables, you name it). When you extract the smallest record from the queue, the priority changes and that file handle gets moved to a new place in the queue. You keep pulling records from the queue until the entire queue is empty. The outline is like this: 1. Sort chunks 2. Write chunks 3. Insert top record of chunks into priority queue 4. Extract records from queue, writing them to final output 5. Repeat step 4 until queue is empty. > > #2. Load ONLY the keys that are to be sorted into memory. Use a > > pointer exchange sort, and do not move the physical rows of data at all. > > This suggestion isn't a whole lot better; in general the rows to be > sorted don't exist until we compute them, and so proposing that we > "don't load them until later" is pretty much irrelevant. Also, in > a lot of common cases the keys to be sorted are the bulk of the data > anyway. This suggestion is in addition to suggestion 1. They are not even related except that both suggestions make the sort run a lot faster. I think I did not explain it clearly enough. Suppose that you have a set of rows you need to sort. Instead of loading the whole row into memory, just load the columns (or parts of columns) that are being sorted. I hope that it is more clear now. > > regards, tom lane ---------------------------(end of broadcast)--------------------------- TIP 4: Have you searched our list archives? http://archives.postgresql.org |
| ||||
| On Wed, Mar 08, 2006 at 03:35:53PM -0800, Dann Corbit wrote: > I think I did not explain it clearly enough. Suppose that you have a > set of rows you need to sort. Instead of loading the whole row into > memory, just load the columns (or parts of columns) that are being > sorted. I hope that it is more clear now. The issue is that there is a non-trivial amount of overhead in going back to disk to get the raw data, and then you have to parse that into a valid in-memory tuple. A worst-case scenario is if you're sorting all the data that you've been asked to retrieve, ie: SELECT a, b, c ... ORDER BY b, a, c; That case is almost guaranteed to take longer if you try and do it with just pointers. But there is the other case: SELECT a, b, c, big_honking_text_field ... ORDER BY a, b, c; In this example it's entirely possible that leaving the big_honking field out of the actual sorting would be a big win. Especially if your temporary space was on a different set of spindles. Regarding your suggestion of testing different kinds of sorts, that's certainly a good idea if it can be done without a huge amount of work coding each one up. Ultimately, it might make the most sense to support multiple sort algorithms (at least for now) and let the planner decide which one to use. That would at least get us a lot more real-world data than any other method would. -- Jim C. Nasby, Sr. Engineering Consultant jnasby@pervasive.com Pervasive Software http://pervasive.com work: 512-231-6117 vcard: http://jim.nasby.net/pervasive.vcf cell: 512-569-9461 ---------------------------(end of broadcast)--------------------------- TIP 6: explain analyze is your friend |
| Thread Tools | |
| Display Modes | |
|
|