1

我相信我是一个相当简单的问题,我无法在 Stack 或 Google 土地上找到它。我有一个相当基本的选择语句,如下所示:

SELECT
    itemid,
    itemdiscription,
    SUM(quantity)
FROM     mytable
GROUP BY itemid, itemdescription
ORDER BY itemid
LIMIT    250
OFFSET   0;

基本上,这是从超过 100k + 记录左右的表中提取的,或者更少,它是一个临时表。所以我想弄清楚的是提供可靠数据的 SUM 函数,因为相似的项目 id 之间可能有 30k 条记录。我最初的想法是这会执行查询,然后只返回前 250 个结果,但后来我想可能不是,所以我想我会要求社区确认这是如何工作的。

我使用 LIMIT/OFFSET 的主要原因是因为我正在从 PHP 执行查询,并且这些值是为性能而迭代的变量,所以我不处理使用大量内存的数组。

谢谢!

4

3 回答 3

1

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

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

这是使用 LIMIT 的几种方法的 SQL Fiddle

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

于 2012-12-19T22:45:14.103 回答
0

首先,LIMIT 在处理完查询结果后对其进行处理。但是,如果服务器认为结果相同,则可以对此进行优化 - 例如,如果是索引字段,SELECT x FROM t ORDER BY x LIMIT 1它将工作得非常快。x

但是,如果你在这里使用 LIMIT/OFFSET 来提高性能或实现分页,你应该重新考虑你的方法。这是因为即使所有聚合字段都已编入索引并且 LIMIT 可以利用这一点,但当 OFFSET 增加时,总工作量也会增加,并且运行时间很快就会变得几乎与在没有 LIMIT 的情况下运行完整查询相同 - 非常昂贵。

如果您要保持 OFFSET 非常低(最好是 0),我强烈建议您添加复合索引(itemid,itemdescription)- 它应该使您的查询运行得更快,特别是如果您有许多行具有相同的itemid.

于 2012-12-20T03:57:06.433 回答
0

EXPLAIN你的查询,看看它是如何执行的。您会看到,这LIMIT是在分组后应用的。

于 2012-12-20T11:41:45.950 回答