Повысьте производительность SELECT CASE с помощью Partition Plus COUNT - PullRequest
1 голос
/ 12 августа 2011

Я пересмотрел код на основе предложений, но теперь производительность снизилась. Любые предложения приветствуются

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

1 Ответ

0 голосов
/ 12 августа 2011

Я не верю, что SQL делает это, поддерживая логику типа AND, встроенную в функцию ранжирования таким образом.Возможно, вам придется разбить его на дальнейшие подзапросы.Некоторый экстремальный псевдо-код:

  • Выберите ранг над работой для 'C'
  • Полное внешнее объединение выберите ранг над домом для “R”
  • Сделать этот подзапросс внешним запросом, выполняющим объединение, и всеми внешними объединениями

Но тогда вам придется иметь дело с COUNT ... OVER ..., и это число не зависит от h.MyType =C или R, что заставляет меня задуматься, не приведет ли этот MAXCOUNT к выравниванию значений ранжирования, которые настолько ограничены.

Все это предполагает, что я правильно понял ... но это сложный запрос, и труднопонимать без знания базовых таблиц и бизнес-логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...