2016-09-20 3 views
0

Я выполняю операцию сворачивания в своей хранимой процедуре следующим образом, но это влияет на производительность, поскольку я использую ее для отчета.SQL - Улучшение производительности сводных запросов

Есть ли способ/заменить эту операцию поворота, чтобы улучшить производительность? или я могу применять индексы для этого?

SELECT colId,colSequence,colDescription, 
ISNULL([1],0) AS 'IESO',ISNULL([2],0) AS 'RFRC',ISNULL([3],0) AS 'EAL',ISNULL([4],0) AS 'HNS',ISNULL([5],0) AS 'PTE',ISNULL([6],0) AS 'EOC',ISNULL([7],0) AS 'MU' 
FROM 
( 
SELECT PF.FeatureId,PF.Sequence,PF.[Description],PTB.BenefitId, 
FROM PSP.table1 PF 
LEFT JOIN PSP.table2 PTB ON PF.FeatureId = PTB.FeatureId 
left JOIN PSP.table3 PO ON PO.productID = PF.productId 
WHERE PF.ProductId = @ProductId AND PF.IsDeleted = 0 

) PS 
PIVOT 
( 
MAX (BenefitId) 
FOR BenefitId IN 
([1],[2],[3],[4],[5],[6],[7]) 
) AS pvt 
ORDER BY colSequence 
+1

Зачем использовать ПО в подзапросе? Его поля не используются при выборе –

+0

Опубликуйте план выполнения. Что такое 'индексы', доступные в' table 1,2 & 3' –

+0

Вы можете попробовать запустить SQL на этой странице, чтобы увидеть, отсутствуют ли у вас какие-либо индексы (и если да, какое влияние они окажут на производительность) : http://www.mikesknowledgebase.com/pages/SQLServer/FindingMissingIndexes.htm –

ответ

0

Использование запросов left JOIN PSP.table3 PO но эта таблица не отображается в списке SELECT поля подзапроса.

Если эта таблица не используется, ее можно удалить, чтобы вы получили операцию.

проверить индексы ваших таблиц запросов, но я полагаю, вы имеете на FeatureId индекс как на productID поле

+0

Есть возможности, которые * фильтры * в таблице таблицы3 добавляются динамически через код приложения –

+0

@Prdp: но table3 находится в LEFT JOIN, поэтому он может Не режут. Возможно, ему нужно увеличить номера строк, но мы должны подождать ответа нашего OP –

+0

Согласовано, возможно, это может увеличить количество строк, но практически это не имеет никакого смысла –

0

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

SELECT colId   = PF.FeatureId, 
     colSequence  = PF.Sequence, 
     colDescription = PF.[Description], 
     PTB.* 
FROM PSP.table1 PF 
     OUTER APPLY (
      SELECT 'IESO' = COUNT(CASE WHEN BenefitId = 1 THEN 1 END), 
        'RFRC' = COUNT(CASE WHEN BenefitId = 2 THEN 1 END), 
        'EAL' = COUNT(CASE WHEN BenefitId = 3 THEN 1 END), 
        'HNS' = COUNT(CASE WHEN BenefitId = 4 THEN 1 END), 
        'PTE' = COUNT(CASE WHEN BenefitId = 5 THEN 1 END), 
        'EOC' = COUNT(CASE WHEN BenefitId = 6 THEN 1 END), 
        'MU' = COUNT(CASE WHEN BenefitId = 7 THEN 1 END) 
      FROM PSP.table2 PTB 
      WHERE PF.FeatureId = PTB.FeatureId 
     ) PTB 
WHERE PF.ProductId = @ProductId 
     AND PF.IsDeleted = 0 
Смежные вопросы