在具有a,b,c,d,e,f,g,h,i,j,k列的表上,我得到:
select * from misty order by a limit 25;
Time: 302.068 ms
和:
select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25;
Time: 1258.451 ms
有没有一种方法可以使按列选择速度如此之快?
更新:
在表上没有索引,新创建了一个
这是EXPLAIN ANALYZE,似乎不太有用:
explain analyze select * from misty order by a limit 25;
Limit (cost=43994.40..43994.46 rows=25 width=190) (actual time=404.958..404.971 rows=25 loops=1)
-> Sort (cost=43994.40..45731.11 rows=694686 width=190) (actual time=404.957..404.963 rows=25 loops=1)
Sort Key: a
Sort Method: top-N heapsort Memory: 28kB
-> Seq Scan on misty (cost=0.00..24390.86 rows=694686 width=190) (actual time=0.013..170.945 rows=694686 loops=1)
Total runtime: 405.019 ms
(6 rows)
和:
explain analyze select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25;
Limit (cost=43994.40..43994.46 rows=25 width=190) (actual time=1371.735..1371.745 rows=25 loops=1)
-> Sort (cost=43994.40..45731.11 rows=694686 width=190) (actual time=1371.733..1371.736 rows=25 loops=1)
Sort Key: a
Sort Method: top-N heapsort Memory: 28kB
-> Seq Scan on misty (cost=0.00..24390.86 rows=694686 width=190) (actual time=0.015..516.355 rows=694686 loops=1)
Total runtime: 1371.797 ms
(6 rows)
列是否已建立索引?你可以发表解释分析吗?
—
user_0 2015年
您需要注意连续进行两次选择并比较时间。第二个查询的缓存中的数据可能会造成时间差异。
—
Walter Mitty 2015年
我也看到了差异,尽管差异不那么明显。我的表的行数= 514431,宽度= 215,对于这种
—
Colin't Hart
select *
情况,我得到大约1.5s,对于select而言,我得到大约2.2s,列以不同的顺序列出。
如果我按照表中定义的顺序列出所有列,则获得的时间与I大致相同
—
Colin't Hart 2015年
select *
。
标题具有误导性。问题实际上是为什么排序的持续时间取决于输出列的顺序。
—
DanielVérité2015年