Sql 使用内部联接提高相关子查询的性能
我有以下子查询:Sql 使用内部联接提高相关子查询的性能,sql,postgresql,inner-join,correlated-subquery,Sql,Postgresql,Inner Join,Correlated Subquery,我有以下子查询: SELECT b.state, b.city, count(b.state) as totalCount, sum(cast(replace(b.annual_prod, ',','.') as decimal)) AS annualProd, ( SELECT count(size_k) FROM opentable_clean a WHERE a.state = b.state AND a.city = b
SELECT
b.state,
b.city,
count(b.state) as totalCount,
sum(cast(replace(b.annual_prod, ',','.') as decimal)) AS annualProd,
(
SELECT count(size_k)
FROM opentable_clean a
WHERE a.state = b.state
AND a.city = b.city
AND cast(replace(a.size_k, ',','.') as decimal) >= 20
GROUP BY a.state, a.city
) as Above20k
FROM opentable_clean b
GROUP BY b.state, b.city
ORDER by annualProd DESC;
这是可行的,但由于基础表的大小,查询效率非常低,并且需要很长时间。我认为使用内部连接可以提高性能,但我还没能尝试一个有效的连接
任何建议都会很有帮助,因为我是sql新手。这不是您要寻找的联接,而是聚合函数的一个条件。。像这样的
select b.state,
b.city,
count(b.state) as totalCount,
sum(cast(replace(b.annual_prod, ',','.') as decimal)) AS annualProd,
SUM(CASE
WHEN cast(replace(a.size_k, ',','.') as decimal) >= 20
THEN 1
ELSE 0 END) as Above20k
FROM opentable_clean b
GROUP BY b.state, b.city
ORDER by annualProd DESC;
在执行所有这些替换时,您仍然会看到一些成功之处——如果您能够在表上创建一个计算的持久化列来正确存储字符串,那么您的查询将执行得更好
这样做的原因是:不需要引擎扫描两次表,它应该能够在一次扫描中完成整个任务,因为您只处理一个表。如果您实际上使用的是第二个表,那么您可能希望对适当的
联接使用相同的方法。如果您希望提高查询的性能,那么您应该首先查看执行计划和io统计信息
要查看执行计划,请单击“显示执行计划”按钮
要查看io统计信息,请在运行SET STATISTICS io ON
后运行查询。统计信息将与消息一起出现
如果没有索引,此查询将通过tableScan/clusteredIndexScan读取open_表b,然后将每个组分组并通过tableScan/clusteredIndexScan读取open_表a
最简单的索引是(州、市)上的一个索引。似乎您正在将数字存储为字符串(a.size\u k
),并且您的内部where
子句中的类型转换和字符串操作可能无法使用。你能修好表格来正确存储你的数字数据吗?你使用的是哪种数据库管理系统?博士后?Oracle?我在使用Postgres。你确定OP使用的是SQL Server吗?谢谢Dan。这很有效。我只需要在你的上述解决方案中用sum替换count。没问题。如果这个答案对你有帮助,考虑把它标记为接受-为了将来的参考,最好是在原来的问题中标记你使用的RDBMS(我已经为你更新了标签)。我确信这将对代码< SQLServer < /C> >有效,但是<代码>和> /代码>也是有意义的。