Самый оптимизированный способ получения итоговых значений столбцов в SQL Server 2005+ - PullRequest
0 голосов
/ 13 октября 2010

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

В настоящее время у меня есть SQL, похожий на следующее:

SELECT count(case when prg.prefix_id = 1 then iss.id end) +
       count(case when prg.prefix_id = 2 then iss.id end) as total,
       count(case when prg.prefix_id = 1 then iss.id end) as c1,
       count(case when prg.prefix_id = 2 then iss.id end) as c2
FROM dbo.TableName
WHERE ...

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

Это очень маленький образец SQL, есть более 20 столбцов иw / i эти столбцы 4 или более из них суммируются время от времени.

Я думал об объявлении некоторых @Parameters и установке каждого из столбцов равным @Parameter, тогда я мог бы просто сложить что@Parameters Мне нужно было показать итоговые значения столбцов, т.е.: SET @Total = @c1 + @c2

Но разве движок SQL Server заботится о том, чтобы столбцы были там несколько раз, как это?Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

Любая причина, по которой это не сделано как

select prg.prefix_id, count(1) from tablename where... group by prg.prefix_id     

Это оставит вас с результирующим набором prefix_id и количеством строк для каждого prefix_ID ... может быть предпочтительным по сравнению с рядом операторов count (case), и я думаю, что это должно быть быстрее, но я могу Т точно подтвердить.

Я бы использовал подзапрос, прежде чем сам прибегать к @vars. Как то так:

   select c1,c2,c1+c1 as total from 
   (SELECT 
   count(case when prg.prefix_id = 1 then iss.id end) as c1, 
   count(case when prg.prefix_id = 2 then iss.id end) as c2 
   FROM dbo.TableName 
   WHERE ... ) a
1 голос
/ 13 октября 2010

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

SELECT iv1.c1 + iv1.c2 as total,
       iv1.c1,
       iv1.c2
    FROM
    (
    SELECT count(case when prg.prefix_id = 1 then iss.id end) as c1,
           count(case when prg.prefix_id = 2 then iss.id end) as c2
    FROM dbo.TableName
    WHERE ...
    ) AS iv1

Таким образом, вы логически получаете счетчики один раз и можете вычислять значения на основе этих счетчиков.Однако я думаю, что SQL Server достаточно умен, чтобы не сканировать счетчик n раз, поэтому я не знаю, будет ли ваш план отличаться от отправленного вами SQL и вашего SQL.

...