【问题标题】:Improve performance on SELECT CASE with Partition Plus COUNT使用 Partition Plus COUNT 提高 SELECT CASE 的性能
【发布时间】:2011-10-26 01:38:53
【问题描述】:

我根据建议修改了代码,但现在性能下降了。欢迎任何建议

select *
    from (
    SELECT 
         d.ID, 
           d.HeaderId,
        CASE WHEN h.MyType = 'C' THEN
            RANK() OVER (PARTITION BY  l.Work ORDER BY l.Address1 DESC) 
        ELSE
            RANK() OVER (PARTITION BY  l.Home ORDER BY l.Address1 DESC)
        END 
        AS 'RANK',


        CASE WHEN h.MyType = 'C' THEN
            COUNT(l.Work) OVER (PARTITION BY  l.Work)
        ELSE
            COUNT(l.Home) OVER (PARTITION BY  l.Home)
        END  
        AS 'MAXCOUNT'

    FROM schema1.Details AS d 
        JOIN schema1.BatchHeader AS h 
          ON d.HeaderId = h.ID
        JOIN schema2.Details AS l
          ON d.LeadBatchDetailId = l.Id
        LEFT JOIN LDCs AS ldcElec 
          ON l.LDC_Elec = schema3.Code
        LEFT JOIN LDCs AS ldcGas 
          ON l.ldc_gas = ldcGas.Code
        LEFT JOIN schema2.Accounts ag
          ON (l.Work = ag.Phone AND 'G' = ag.Business AND h.MyType = 'C')
          OR (l.Home = ag.Phone AND 'G' = ag.Business AND h.MyType = 'R')
        LEFT JOIN schema2.Accounts ae 
          ON (l.Work = ae.Phone AND 'E' = ae.Business AND h.MyType = 'C')
          OR (l.Home = ae.Phone AND 'E' = ae.Business AND h.MyType = 'R')
        WHERE d.HeaderId = @Id) 
    ) a     
WHERE [RANK] = [MAXCOUNT] 
ORDER BY LdcGasName, LdcElecName

【问题讨论】:

  • 只是一个想法,应该是CASE语句吗? CASE WHEN h.MyType = 'C' THEN RANK() OVER ... ELSE .. another RANK() END AS 'RANK'
  • 案例工作,但现在很慢
  • 很难从一个查询中知道要优化哪个部分。你有没有解释清楚查询中最昂贵的部分在哪里?

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

我不相信 SQL 会这样做,它支持以这种方式嵌入在排名函数中的 AND 类型逻辑。您可能需要将其分解为进一步的子查询。一些极端的伪代码:

  • 为“C”选择排名而不是工作
  • “R”的完全外连接选择排名高于首页
  • 将其设为子查询,外部查询执行合并和所有外部联接

但是你必须处理 COUNT...OVER...,并且该计数不依赖于 h.MyType = C 或 R,这让我想知道 MAXCOUNT 最终是否会等于排名值太受限制了。

这一切都假设我没看错……但这是一个复杂的查询,如果不了解底层表和业务逻辑,就很难理解。

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 2022-09-30
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多