作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我无法理解为什么会出现以下查询:
SELECT ref,
article_number,
count(article_number)
FROM invoice
INNER JOIN goods_list USING (invoice_number)
WHERE invoice_owner = 'someone'
GROUP BY invoice_number, article_number
LIMIT 1
比这个慢得多:
WITH base_data AS (
SELECT invoice_number
FROM invoice
WHERE invoice_owner = 'someone'
LIMIT 1
)
SELECT invoice_number,
article_number,
count(article_number)
FROM base_data
INNER JOIN goods_list USING (invoice_number)
GROUP BY invoice_number, article_number
是否在返回整个结果集后应用限制?
最佳答案
第一个查询处理发票所有者的所有 数据。它执行分组依据
,最终返回一行。
第二个查询预先在 CTE 中获取发票所有者的一行。它将该单行连接到另一个表中,然后对更少的行进行聚合。
因此,第二个查询要快得多也就不足为奇了,因为它为聚合处理的行要少得多。
注意:当使用limit
时,您还应该使用order by
。否则,您可以在代码运行时获得任何匹配的行,甚至可能在不同的运行中获得不同的行。
关于database - 为什么即使在限制结果时公用表表达式也更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34289005/
我是一名优秀的程序员,十分优秀!