73 / 73 / 20
Регистрация: 11.01.2014
Сообщений: 252
Записей в блоге: 2
1

Запррсы с PIVOT

27.03.2014, 15:27. Показов 1592. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем. Может кто нибудь знает есть ли у PIVOT оптимизация с точки зрения скорости?

например запрос тормозит сильно:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
SET @execText = N'SET @xmlOut =
        (SELECT dbo.fGetDIDName(mpc.DID)as  ''@DIDName'',
            mpc.DID                     as  ''@DID'',
            mpc.StateNewDrugs           as  ''@stateNewDrugs'', 
            mpc.StateDepartament        as  ''@stateDepartament'',
            mpc.StateHeaderOfPlan       as  ''@stateHeaderOfPlan'',
            (SELECT * 
             FROM 
                (SELECT pr1.productID   prodID, 
                    pr1.grCode          grC,
                    pr1.grCode1         grC1,
                    pr1.grName          grN,
                    pr1.grName1         grN1,
                    pr1.isNewInnov      isNewInnov,
                    pr1.regCountres     regC,
                    pr1.productCode     prodC,
                    pr1.commercialName  commN,
                    pr1.measure         meas,
                    ' + @countryNames + '
                 FROM #prices pr1 LEFT JOIN
                    (SELECT pn.countryN, pn.ProductID, pn.VolumeMonth
                     FROM #tmp as pn
                    ) as p PIVOT (SUM(VolumeMonth) FOR countryN IN(' + @countryNames + ')) as res
                    ON res.ProductID = pr1.ProductID
                 WHERE  pr1.DID = p1.DID
                ) as [plan]
             FOR XML AUTO, TYPE
            )
        FROM tbPEMonthPlanChecks mpc LEFT JOIN #prices p1 
            ON p1.DID = mpc.DID
        WHERE mpc.PlanMonthID = @planMonthID AND mpc.PlanMonthVersion = @planMonthVersion
            AND (@roleSONP = 1 OR p1.DID IS NOT NULL)
        GROUP BY mpc.DID, p1.DID, mpc.StateNewDrugs, mpc.StateDepartament,mpc.StateHeaderOfPlan
        ORDER BY mpc.DID
        FOR XML PATH(''DIDsPlan''))
        '
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.03.2014, 15:27
Ответы с готовыми решениями:

Использование Pivot
Добрый день. Есть таблица: Lagerid (артикул - int)| FilID (номер объекта - int) | Price (цена -...

PIVOT SQL
помогите пожалуйста!!!! кто нибудь знает как работает Pivot??? SELECT t_elm.providerid...

Pivot и 2 агрегирующие функции
Добрый день. Я не совсем понимаю, как можно вместить 2 агрегирующие функции в запрос с Pivot....

Запрос с функцией PIVOT
Доброе утро! Необходимо написать запрос, состоящий из трех таблиц, в двух из которых строки надо...

15
63 / 63 / 21
Регистрация: 08.02.2013
Сообщений: 262
27.03.2014, 15:30 2
всегда сторонюсь пивота, но когда без него не обойтись, то мастерю без оптимизации, сложен он для моего понимая
разве что с непосредственно с запросами можно поиграться, посмотри план выполнения, может он не по индексированным полям идет и из-за этого долго
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
27.03.2014, 17:01 3
У вас запрос с pivot - инвариант. Можно выполнить один раз и сохранить результат во временной таблице с PK. Заодно от DSQL в основном запросе избавитесь.

Добавлено через 6 минут
Насчет отказа от DSQL в основном запросе я погорячился.
0
73 / 73 / 20
Регистрация: 11.01.2014
Сообщений: 252
Записей в блоге: 2
27.03.2014, 17:35  [ТС] 4
Цитата Сообщение от invm Посмотреть сообщение
У вас запрос с pivot - инвариант. Можно выполнить один раз и сохранить результат во временной таблице с PK.
А что это значит? У меня в таблицу не получится т.к. countryNames у меня переменная типа string.
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
27.03.2014, 17:48 5
Цитата Сообщение от golandy Посмотреть сообщение
У меня в таблицу не получится т.к. countryNames у меня переменная типа string.
Это не есть препятствие:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
declare @s varchar(max), @CountryNames varchar(max) = 'Russian Federation, Poland, United Kingdom, Spain';
 
begin tran;
 
create table #t (id int primary key);
 
select
 @s = 'alter table #t add [' + replace(@CountryNames, ', ', '] int null; alter table #t add [') + '] int null;'
 
exec(@s);
 
select * from #t;
 
rollback;
1
73 / 73 / 20
Регистрация: 11.01.2014
Сообщений: 252
Записей в блоге: 2
27.03.2014, 17:58  [ТС] 6
А если пишет

The identifier that starts with '[c_1] varchar(20) null; alter table #t add [[c_1001] varchar(20) null; alter table #t add [[c_1004] varchar(20) null; alter tabl' is too long. Maximum length is 128.

просто у меня @CountryNames имеет вид [c_4801], [c_4701] и т.д....
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
27.03.2014, 18:08 7
Цитата Сообщение от golandy Посмотреть сообщение
просто у меня @CountryNames имеет вид [c_4801], [c_4701] и т.д....
Ну тогда не надо квотить наименования столбцов при формировании строки с alter'ами.
0
73 / 73 / 20
Регистрация: 11.01.2014
Сообщений: 252
Записей в блоге: 2
27.03.2014, 18:18  [ТС] 8
имеете виду так?

SQL
1
SELECT @s = 'alter table #t add ' + REPLACE(@CountryNames, ', ', ' int null; alter table #t add [') + '] int null;'
Я единственное что не могу доехать как мне потом вынести часть запроса в отдельную таблицу

Можно выполнить один раз и сохранить результат во временной таблице с PK
?

Добавлено через 3 минуты
если я правильно понял то мне можно вынести

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(SELECT pr1.productID   prodID, 
                    pr1.grCode          grC,
                    pr1.grCode1         grC1,
                    pr1.grName          grN,
                    pr1.grName1         grN1,
                    pr1.isNewInnov      isNewInnov,
                    pr1.regCountres     regC,
                    pr1.productCode     prodC,
                    pr1.commercialName  commN,
                    pr1.measure         meas,
                    ' + @countryNames + '
                 FROM #prices pr1 LEFT JOIN
                    (SELECT pn.countryN, pn.ProductID, pn.VolumeMonth
                     FROM #tmp AS pn
                    ) AS p PIVOT (SUM(VolumeMonth) FOR countryN IN(' + @countryNames + ')) AS res
                    ON res.ProductID = pr1.ProductID
                 WHERE  pr1.DID = p1.DID
                ) AS [plan]
в отдельную таблицу запросом?
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,781
27.03.2014, 18:30 9
INTO спасет отца русской демократии
0
73 / 73 / 20
Регистрация: 11.01.2014
Сообщений: 252
Записей в блоге: 2
27.03.2014, 18:31  [ТС] 10
Цитата Сообщение от pincet Посмотреть сообщение
INTO спасет отца русской демократии
если спасет есть пример?
как вставить во временную таблицу я вкурсе. Вопрос как вставить тот кусок кода в запросе есть перемнные величины
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
27.03.2014, 18:47 11
Строим временную таблицу, показанным выше способом. Затем
T-SQL
1
2
3
4
5
6
7
insert into <Временная таблица>
select
 res.*
from
(SELECT pn.countryN, pn.ProductID, pn.VolumeMonth
                     FROM #tmp AS pn
                    ) AS p PIVOT (SUM(VolumeMonth) FOR countryN IN(' + @countryNames + ')) AS res
Далее, думаю, понятно что делать.
1
73 / 73 / 20
Регистрация: 11.01.2014
Сообщений: 252
Записей в блоге: 2
27.03.2014, 19:19  [ТС] 12
а скажите это же в sp_executesql надо выполнять?
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
27.03.2014, 19:33 13
Цитата Сообщение от golandy Посмотреть сообщение
а скажите это же в sp_executesql надо выполнять?
Нет. Я просто поторопился, надо так:
T-SQL
1
2
3
4
5
6
7
8
insert into <Временная таблица>
exec('
select
 res.*
from
(SELECT pn.countryN, pn.ProductID, pn.VolumeMonth
                     FROM #tmp AS pn
                    ) AS p PIVOT (SUM(VolumeMonth) FOR countryN IN(' + @countryNames + ')) AS res');
1
73 / 73 / 20
Регистрация: 11.01.2014
Сообщений: 252
Записей в блоге: 2
28.03.2014, 23:43  [ТС] 14
план запроса вот
Вложения
Тип файла: zip ExecutionPlan1.zip (35.8 Кб, 7 просмотров)
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
28.03.2014, 23:53 15
Пока не увидел ничего криминального. Теперь тоже самое вместе с insert во времянку, плюс добавить статистику по time и io.
0
73 / 73 / 20
Регистрация: 11.01.2014
Сообщений: 252
Записей в блоге: 2
31.03.2014, 15:44  [ТС] 16
планы запроса и ddl таблиц
Вложения
Тип файла: zip планы + ddl таблиц.zip (20.6 Кб, 2 просмотров)
0
31.03.2014, 15:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2014, 15:44
Помогаю со студенческими работами здесь

PIVOT для запроса
Есть такой запрос SELECT YEAR(w.DueDate) as , CONVERT(NVARCHAR(3), DATENAME(MONTH, w.DueDate)) as...

Собственные заголовки строк в pivot
У меня есть таблица с именами и оценками студентов по четырем экзаменам, нужно подсчитать, сколько...

Двойной или тройной Pivot
Кто знает и возможно ли сделать двойной запрос pvoit SET @query ='select * from(select name,...

Не понятен синтаксис PIVOT/UNPIVOT
В общем, проблема такая. У меня есть столбец в базе данных SQL. И мне нужно этот столбец...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru