Database 使用带总和的极限偏移量是否能提供准确的数据?
我相信我有一个相当简单的问题,我无法在Stack上找到,也无法在GoogleLand上找到。我有一个相当基本的选择陈述,是这样的:Database 使用带总和的极限偏移量是否能提供准确的数据?,database,postgresql,Database,Postgresql,我相信我有一个相当简单的问题,我无法在Stack上找到,也无法在GoogleLand上找到。我有一个相当基本的选择陈述,是这样的: SELECT itemid, itemdiscription, SUM(quantity) FROM mytable GROUP BY itemid, itemdescription ORDER BY itemid LIMIT 250 OFFSET 0; 基本上,这是从一个超过100k+记录的表中提取的,或者更少,这取决于
SELECT
itemid,
itemdiscription,
SUM(quantity)
FROM mytable
GROUP BY itemid, itemdescription
ORDER BY itemid
LIMIT 250
OFFSET 0;
基本上,这是从一个超过100k+记录的表中提取的,或者更少,这取决于它是一个临时表。所以我想弄明白的是求和函数提供了可靠的数据,因为在相似的条目ID之间可能有30k条记录。我最初的想法是,这将预先执行查询,然后只返回前250个结果,但后来我开始考虑可能不会,所以我想我应该请社区确认这是如何工作的
我使用LIMIT/OFFSET的主要原因是因为我从PHP执行查询,这些值是为执行而迭代的变量,所以我没有处理使用大量内存的数组
谢谢 > P>作为DOCS状态,限制(或偏移)适用于“由其余查询生成的行”,因此在应用极限或偏移之前考虑查询的结果。应用这些子句会影响这些结果 下面是一些使用极限的方法
< P>作为DOCS状态,限制(或偏移)适用于“由其余查询生成的行”,因此在应用极限或偏移之前考虑查询的结果。应用这些子句会影响这些结果 下面是一些使用极限的方法
首先,在查询结果被处理后,LIMIT在查询结果的顶部工作。但是,如果服务器认为结果相同,则可以对此进行优化-例如,如果将
x
索引到字段中,则从t ORDER BY x LIMIT 1中选择x将非常快
但是,如果您在这里使用LIMIT/OFFSET来提高性能或实现分页,则应该重新考虑您的方法。这是因为,即使所有聚合字段都已编制索引,LIMIT也可以利用这一点,当偏移量增加时,总工作量也会增加,很快运行时将几乎与无限制运行完整查询一样—非常昂贵
如果要将偏移量保持在非常低的水平(最好是0),我强烈建议在(itemid,itemsdescription)
上添加复合索引-这会使您的查询运行得更快,特别是当您有许多行具有相同的itemid
首先,在查询结果处理后,LIMIT会在查询结果的顶部起作用。但是,如果服务器认为结果相同,则可以对此进行优化-例如,如果将x
索引到字段中,则从t ORDER BY x LIMIT 1中选择x将非常快
但是,如果您在这里使用LIMIT/OFFSET来提高性能或实现分页,则应该重新考虑您的方法。这是因为,即使所有聚合字段都已编制索引,LIMIT也可以利用这一点,当偏移量增加时,总工作量也会增加,很快运行时将几乎与无限制运行完整查询一样—非常昂贵
如果要将偏移量保持在非常低的水平(最好是0),我强烈建议在(itemid,itemsdescription)
上添加复合索引-这会使您的查询运行得更快,特别是如果您有许多行具有相同的itemid
解释一下您的查询,看看它是如何执行的。您将看到,限制
在分组后应用。解释您的查询,查看它是如何执行的。您将看到,分组后将应用限制
。将执行整个求和操作,然后只有最终结果集将受到限制/偏移
的影响。将执行整个求和操作,然后只有最终结果集将受到限制/偏移
的影响。谢谢,我只是想100%确定,没有足够的测试数据来确认。谢谢你的小提琴链接!我想这会派上用场:-)谢谢,我只是想100%确定,没有足够的测试数据来确认。谢谢你的小提琴链接!我认为这很有用:-)性能问题是当我尝试在php中将75列和值的100k多条记录存储到单个数组中,然后循环,以便数据可以被处理,然后在web应用程序中显示。容纳该数组所需的内存对于php web服务器来说太高。当然,我可以增加每个会话的最大可用内存,但如果多个用户同时进行交互,仍然会导致问题。因此,我通过限制返回的记录来限制php数组的大小。另一方面,我更喜欢一次获取所有数据。性能问题是当我尝试在php中将75列和值的100k多条记录存储到单个数组中,然后循环,以便可以对数据进行操作,然后在web应用程序中显示。容纳该数组所需的内存对于php web服务器来说太高。当然,我可以增加每个会话的最大可用内存,但如果多个用户同时进行交互,仍然会导致问题。因此,我通过限制返回的记录来限制php数组的大小。另一方面,我宁愿一次获得所有数据。