使用带LIM的LIMIT OFFSET会提供准确的数据吗?

时间:2012-12-19 22:16:30

标签: database postgresql

我相信我是一个相当简单的问题,我无法在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>

谢谢!

3 个答案:

答案 0 :(得分:1)

正如文档所述,限制(或偏移)适用于“由查询的其余部分生成的行”,因此请在应用限制或偏移之前考虑查询的结果。然后应用这些条款会影响这些结果。

http://www.postgresql.org/docs/9.2/static/queries-limit.html

这是使用LIMIT的几种方法的SQL小提琴

http://www.sqlfiddle.com/#!12/08fa0

答案 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