我相信我是一个相当简单的问题,我无法在Stack上找到这个问题,也不能在谷歌这个地方找到。我有一个相当基本的选择陈述,就像这样:
SELECT
itemid,
itemdiscription,
SUM(quantity)
FROM mytable
GROUP BY itemid, itemdescription
ORDER BY itemid
LIMIT 250
OFFSET 0;
基本上这是从超过100k +记录的表中拉出来的,或者更少,这取决于它是一个临时表。所以我想弄清楚的是提供可靠数据的SUM函数,因为类似的项ID之间可能有3万条记录。我最初的想法是,这会预先形成查询,然后只返回前250个结果,但后来我想到也许没有,所以我想我会要求社区确认这是如何工作的。
我使用LIMIT / OFFSET的主要原因是因为我正在从PHP中执行查询,这些值是为了执行而迭代的变量,所以我不处理使用大量内存的数组。 / p>
谢谢!
答案 0 :(得分:1)
正如文档所述,限制(或偏移)适用于“由查询的其余部分生成的行”,因此请在应用限制或偏移之前考虑查询的结果。然后应用这些条款会影响这些结果。
http://www.postgresql.org/docs/9.2/static/queries-limit.html
这是使用LIMIT的几种方法的SQL小提琴
答案 1 :(得分:0)
首先,LIMIT在处理完成后处理查询结果。但是,如果服务器认为结果相同,则服务器可以对此进行优化 - 例如,如果SELECT x FROM t ORDER BY x LIMIT 1
是索引字段,x
将非常快速地工作。
但是,如果你在这里使用LIMIT / OFFSET来提高性能或实现分页,你应该重新考虑你的方法。这是因为即使所有聚合字段都被索引并且LIMIT可以利用它,当OFFSET增加时,总工作量也会增加,很快运行时变得几乎与没有LIMIT的情况下运行完整查询相同 - 非常昂贵。
如果你要保持OFFSET非常低(最好是0),我强烈建议在(itemid,itemdescription)
上添加复合索引 - 它应该让你的查询运行得更快,特别是如果你有很多行具有相同的itemid
。
答案 2 :(得分:0)
EXPLAIN
您的查询,以及如何执行。您会看到,在分组后应用了LIMIT
。