Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用内部联接提高相关子查询的性能_Sql_Postgresql_Inner Join_Correlated Subquery - Fatal编程技术网

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> >有效,但是<代码>和> /代码>也是有意义的。