【问题标题】:Embedded SQL Count is taking too much to proceed嵌入式 SQL 计数需要太多时间才能继续
【发布时间】:2014-07-31 10:01:34
【问题描述】:

这是我的 SQL 命令:

SELECT  
    ts.CHECK_NUMBER,
    ts.CUSTOMER_NAME,
    ts.COMPANY_NAME,
   ( SELECT COUNT(*) 
     FROM   TRANSACTION_ORDER too 
     WHERE  too.CHECK_NUMBER = ts.CHECK_NUMBER
    ) as NB_OF_ORDERS
FROM 
     TRANSACTION_SUMMARY ts
ORDER BY 
     ts.BUSINESS_DATE

渲染数据需要很长时间,我们正在谈论至少 3000 笔交易,对于每笔交易,我们必须计算订单。

有没有更好的解决方案?

【问题讨论】:

  • 您可以尝试使用 JOIN。但是当您遇到性能问题时,您应该真正添加有关您拥有的索引和查询的解释计划的详细信息。这些细节对于了解可以优化的内容绝对是基础。
  • transaction_summary.business_date 列上是否有(升序)索引,是否聚集或其他? transaction_order.check_number的同样问题...
  • 正如@Frazz 提到的,您可以从 SSMS 获得执行计划。分析它并确保计划中的任何内容都使用适当的索引。如果某些列不存在索引,则 sql-server 将执行可能非常昂贵的表扫描。

标签: sql sql-server performance database-performance query-performance


【解决方案1】:

这花费了太长时间,因为当您在 select 中有这个子查询时,它会针对外部查询返回的每一行执行,所以如果您的外部查询返回 50,000 行,这个内部查询将被执行 50,000 次显然是性能杀手,

你应该试试这样的......

SELECT  
     ts.CHECK_NUMBER
    ,ts.CUSTOMER_NAME
    ,ts.COMPANY_NAME
    ,ISNULL(O.Total, 0) AS NB_OF_ORDERS
FROM  TRANSACTION_SUMMARY ts
LEFT JOIN    --<-- use inner join is you only want records with some orders
      ( SELECT CHECK_NUMBER, COUNT(*) AS Total 
        FROM   TRANSACTION_ORDER 
        GROUP BY CHECK_NUMBER
      ) as O
ON ts.CHECK_NUMBER = O.CHECK_NUMBER
ORDER BY  ts.BUSINESS_DATE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2019-07-04
    • 2022-12-23
    • 1970-01-01
    相关资源
    最近更新 更多