On Thu, Dec 23, 2010 at 10:26 AM, Tom Lane <t...@sss.pgh.pa.us> wrote:
> Kenneth Marshall <k...@rice.edu> writes: > > On Thu, Dec 23, 2010 at 10:42:26PM +0800, Li Jie wrote: > >> But in the last query that sorts on "id", since the query selects all > the columns for output, the actual sorted size is the same, and the only > difference is the comparison cost. The query sorting on two columns needs to > do twice the comparison. Am I right? > > > I think you are right. Sorry for the confusion. > > I doubt the cost of comparing two integers is the issue here; rather > it's more likely one of how many merge passes were needed. You could > find out instead of just speculating by turning on trace_sort and > comparing the log outputs. > > regards, tom lane > I follow your advice and set the trace_sort, here is the two queries result, the log outputs looks similar and they seem to use the same number of tapes. But the time is different. Could you have a look: postgres=# explain analyze select * from big_wf order by id; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------- Sort (cost=565525.45..575775.45 rows=4100000 width=8) (actual time=28102.985..39351.309 rows=4100000 loops=1) Sort Key: id Sort Method: external merge Disk: 72048kB -> Seq Scan on big_wf (cost=0.00..59142.00 rows=4100000 width=8) (actual time=9.190..7262.789 rows=4100000 loops=1) Total runtime: 42953.855 ms (5 rows) STATEMENT: explain analyze select * from big_wf order by id; LOG: begin tuple sort: nkeys = 1, workMem = 20480, randomAccess = f STATEMENT: explain analyze select * from big_wf order by id; LOG: switching to external sort with 74 tapes: CPU 0.29s/0.28u sec elapsed 0.71 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: finished writing run 1 to tape 0: CPU 0.68s/2.12u sec elapsed 3.41 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: finished writing run 2 to tape 1: CPU 1.22s/4.24u sec elapsed 6.53 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: finished writing run 3 to tape 2: CPU 1.67s/6.38u sec elapsed 9.67 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: finished writing run 4 to tape 3: CPU 2.22s/8.61u sec elapsed 12.93 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: finished writing run 5 to tape 4: CPU 2.72s/10.80u sec elapsed 16.09 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: finished writing run 6 to tape 5: CPU 3.23s/12.86u sec elapsed 19.12 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: finished writing run 7 to tape 6: CPU 3.81s/15.02u sec elapsed 23.84 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: finished writing run 8 to tape 7: CPU 4.36s/17.13u sec elapsed 27.05 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: performsort starting: CPU 4.38s/17.20u sec elapsed 27.15 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: finished writing run 9 to tape 8: CPU 4.39s/17.88u sec elapsed 27.97 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: finished writing final run 10 to tape 9: CPU 4.39s/17.88u sec elapsed 27.97 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: performsort done (except 10-way final merge): CPU 4.39s/17.98u sec elapsed 28.10 sec STATEMENT: explain analyze select * from big_wf order by id; LOG: external sort ended, 9006 disk blocks used: CPU 8.01s/27.02u sec elapsed 42.92 sec STATEMENT: explain analyze select * from big_wf order by id; postgres=# explain analyze select * from big_wf order by age,id; Sort (cost=565525.45..575775.45 rows=4100000 width=8) (actual time=43709.851..57048.645 rows=4100000 loops=1) Sort Key: age, id Sort Method: external merge Disk: 72048kB -> Seq Scan on big_wf (cost=0.00..59142.00 rows=4100000 width=8) (actual time=10.090..7075.208 rows=4100000 loops=1) Total runtime: 60721.824 ms STATEMENT: explain analyze select * from big_wf order by age,id; LOG: begin tuple sort: nkeys = 2, workMem = 20480, randomAccess = f STATEMENT: explain analyze select * from big_wf order by age,id; LOG: switching to external sort with 74 tapes: CPU 0.28s/0.30u sec elapsed 0.67 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: finished writing run 1 to tape 0: CPU 0.71s/3.63u sec elapsed 4.90 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: finished writing run 2 to tape 1: CPU 1.30s/7.53u sec elapsed 10.30 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: finished writing run 3 to tape 2: CPU 1.88s/11.36u sec elapsed 15.39 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: finished writing run 4 to tape 3: CPU 2.43s/15.20u sec elapsed 20.51 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: finished writing run 5 to tape 4: CPU 3.05s/18.96u sec elapsed 25.44 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: finished writing run 6 to tape 5: CPU 3.68s/22.74u sec elapsed 30.47 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: finished writing run 7 to tape 6: CPU 4.24s/26.63u sec elapsed 36.61 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: finished writing run 8 to tape 7: CPU 4.78s/30.41u sec elapsed 41.56 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: performsort starting: CPU 4.81s/30.56u sec elapsed 41.75 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: finished writing run 9 to tape 8: CPU 4.84s/32.07u sec elapsed 43.56 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: finished writing final run 10 to tape 9: CPU 4.84s/32.07u sec elapsed 43.56 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: performsort done (except 10-way final merge): CPU 4.85s/32.16u sec elapsed 43.70 sec STATEMENT: explain analyze select * from big_wf order by age,id; LOG: external sort ended, 9006 disk blocks used: CPU 8.60s/41.93u sec elapsed 60.73 sec STATEMENT: explain analyze select * from big_wf order by age,id;