оптимизация запроса

AigizK
Дата: 15.01.2009 13:49:52
база sql2005,строк в таблице порядка 500 000 записей.Реально колонок больше(не буду говорить,будете смеяться)

DtPriceType
11001
22001
33001
14002
25002
36002
17003
28003
39003


Что я делаю.
1.Создаю временную таблицу с нужными мне колонками(раньше вместо временный использовал with, но потом оказалось,что при обращение к нему каждый раз запрос выполняеться заново,поэтому переделали так).
2.Заполняю временную таблицу только нужными мне данными.
3.Формирую запрос,который потом надо отобразить.

Сам запрос

select Dt,Price,Type into #TTT from MyTable where 1 = 0

insert #TTT select Dt,Price,Type from MyTable  
where ....

select Dt xx,
avg(t1.yy) as col1,
avg(t2.yy) as col2,
avg(t3.yy) as col3
from #TTT  
left join (select avg(Price) as yy,Dt as XX from #TTT where Type=1 group by Dt) t1 on #TTT.Dt=t1.XX
left join (select avg(Price) as yy,Dt as XX from #TTT where Type=2 group by Dt) t2 on #TTT.Dt=t1.XX
left join (select avg(Price) as yy,Dt as XX from #TTT where Type=3 group by Dt) t3 on #TTT.Dt=t1.XX
group by Dt order by Dt
Как можно оптимизировать?
ЖораЖора
Дата: 15.01.2009 15:44:54
в #TTT кластерный индес создать по Dt. Да и еще, добавить его лучше после импорта данных
vino
Дата: 15.01.2009 15:55:33
Похоже, имеет место группировка по двум полям, хотя вторая разворачивается в строке.
Если Type может быть более чем 3, то будет проблема.
Так задумано - выстраивать Type в столбцы?
vino
Дата: 15.01.2009 15:58:07
AigizK
select Dt,Price,Type into #TTT from MyTable where 1 = 0

А это для чего нужно?
Glory
Дата: 15.01.2009 16:00:22
AigizK

Как можно оптимизировать?

Это вы так перекрестный запрос что ли создаете ?
alexeyvg
Дата: 15.01.2009 16:32:02
vino
AigizK
select Dt,Price,Type into #TTT from MyTable where 1 = 0

А это для чего нужно?
Это унаследованный код.

В старых версиях сиквела вставка select ... into ... from лочила системные таблицы напрочь, если, правда, не включить волшебный незадокументированный трейс-флаг.

В более поздних версиях (начиная с 7) такого нету, но привычка осталась...
ЖораЖора
Дата: 15.01.2009 17:12:18
Может PIVOT попробуйте?
Crimean
Дата: 15.01.2009 17:17:41
ЖораЖора
Может PIVOT попробуйте?


+1. вариант
с группировкой по Type, Dt
потому как JOIN жручие
есть вариант через UNION перерисовать, но с PIVOT красивее может получиться
vino
Дата: 15.01.2009 19:51:11
что-то вроде следующего, но pivot доступен с sql2005:
select Dt as AveragePricePerDtByType,[1], [2], [3]
from #TTT PIVOT( avg(Price) for Type in ([1],[2],[3]) )as PivotTable
vino
Дата: 15.01.2009 19:55:35
но, похоже, что и результат будет отличаться...