Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 44242
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
визуально - секунда против трех

запрос
+
use **********
SET STATISTICS TIME ON
declare @p_samAccountName nvarchar(100) = '********';

declare
@Activities table
(
	[ActivityDimKey]            [int] NULL,
	[Activity_id]               [nvarchar](256) NULL,
	[Activity_Title]            [nvarchar](500) NULL,
	[Activity_assignedToUser]   [nvarchar](500) NULL,
    [Activity_StatusValue]      [nvarchar](256) NULL,
	[select_note]               [nvarchar](200) NULL,
	[Activity_Area]             [nvarchar](4000) NULL,
    insertDate                      datetime
)


    /*insert into @Activities
    (
        ActivityDimKey,
        Activity_id,
        Activity_Title,
        Activity_StatusValue,
        [Activity_assignedToUser],
        select_note,
        Activity_Area,
        insertDate
    )*/
	SELECT a.ActivityDimKey,
           a.id                         Activity_id,
           a.title                      Activity_title,
           AStatus.ActivityStatusValue  Activity_StatusValue,
           pers.sAMAccountName          Activity_AssignedToUser_sAMAccountName,
           SUBSTRING(a.id, 1, 2) + ': ' + N'мои и подчиненных'      select_note,
           AreaDS.displayName           Activity_Area,
           getdate()
    FROM [DWDataMart].[dbo].[ActivityDimvw] AS A
	JOIN [DWDataMart].[dbo].[WorkItemDimvw] AS WI ON A.EntityDimKey = WI.EntityDimKey
	JOIN [DWDataMart].[dbo].[WorkItemAssignedToUserFactvw] AS WIAssignedTo ON WIAssignedTo.WorkItemDimKey = WI.WorkItemDimKey AND WIAssignedTo.DeletedDate IS NULL
    inner merge JOIN dbo.get_table_persons(@p_samAccountName) pers on pers.UserDimKey = WIAssignedTo.WorkItemAssignedToUser_UserDimKey
	/*Статус выполнения*/
	LEFT JOIN [DWDataMart].[dbo].[ActivityStatus] AS AStatus ON AStatus.ActivityStatusId = A.Status_ActivityStatusId
	LEFT JOIN [DWDataMart].[dbo].[ActivityAreavw] AS AArea ON AArea.ActivityAreaId = A.Area_ActivityAreaId
	LEFT JOIN DisplayStringDimMV AS AreaDS ON AArea.EnumTypeId = AreaDS.BaseManagedEntityId AND AreaDS.LanguageCode = 'RUS'
	WHERE ISNULL(A.IsDeleted, 0) = 0		-- действие не было удалено
      AND A.ActualStartDate IS NOT NULL		-- действие начали выполнять
      AND A.Status_ActivityStatusId <> 3	-- действие не отменено
      AND isnull(AStatus.ActivityStatusValue, ' ') not in ('Completed', 'Skipped');


без вставки во времянку
SQL Server parse and compile time: 
CPU time = 0 ms, elapsed time = 2 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

(8 row(s) affected)

SQL Server Execution Times:
CPU time = 2627 ms, elapsed time = 934 ms.

со вставкой во времянку
SQL Server parse and compile time: 
CPU time = 0 ms, elapsed time = 2 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 3594 ms, elapsed time = 3705 ms.

(8 row(s) affected)


С уважением, Андрей
10 янв 18, 18:24    [21094514]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 44242
причем такая хрень работает моментально
declare
@Activities table
(
	[ActivityDimKey]            [int] NULL,
	[Activity_id]               [nvarchar](256) NULL,
	[Activity_Title]            [nvarchar](500) NULL,
	[Activity_assignedToUser]   [nvarchar](500) NULL,
	[Activity_StatusValue]      [nvarchar](256) NULL,
	[select_note]               [nvarchar](200) NULL,
	[Activity_Area]             [nvarchar](4000) NULL,
	insertDate                  datetime
)


    insert into @Activities
    (
        ActivityDimKey,
        Activity_id,
        Activity_Title,
        Activity_StatusValue,
        [Activity_assignedToUser],
        select_note,
        Activity_Area,
        insertDate
    )
    SELECT top 100 a.ActivityDimKey,
           a.id,
           a.title,
           null,
           null,
           null,
           null,
           null
    FROM [DWDataMart].[dbo].[ActivityDimvw] AS A
10 янв 18, 18:27    [21094524]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 44242
к сожалению, план посмотреть не могу... прав не дали
10 янв 18, 18:31    [21094540]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 727
так сколько страниц в результате занимает первая переменная и сколько вторая?

т.е. вторая это всяко 1 страница,
а 8 строк, где каждай строка (возможно) по полстраницы,
это 8 строк, да еще и не в dedicated extent, а в mixed.
т.е. вообще может быть в 8 разных экстентах,
и все это надо аллокейтить
10 янв 18, 18:34    [21094550]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3960
Yasha123,

ну прям выделение страниц столько времени это аномально. Я бы грешил на переменную таблицу, смените на веременную
10 янв 18, 18:36    [21094558]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 727
andreymx
к сожалению, план посмотреть не могу... прав не дали

по-вашему что, просто селект и инсерт того же селекта в переменную еще и разные планы имеет?
ну кроме самого оператора инсерта, разумеется, которого нет в первом плане
10 янв 18, 18:36    [21094559]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 727
TaPaK,
может у него офигительнейшая нагрузка на темпдб,
которая еще и в одном файле живет.
10 янв 18, 18:37    [21094564]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 727
TaPaK
Yasha123,

ну прям выделение страниц столько времени это аномально. Я бы грешил на переменную таблицу, смените на веременную

кстати, что вообще за удивление такое,
tempdb contention это очень даже распространенное явление,
как раз из-за вот таких мелкопакостных аллокейшенов в <= 8 страниц
10 янв 18, 18:39    [21094569]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 727
The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention
чисто для ознакомления.
если у него нет showplan,
то кого уже мониторить ожидания на темпдб.
---
еще мою гипотезу можно проверить так:
запустить тот же код для временной таблицы
и для постоянной.
и вот если временная все тот же тормоз, то это оно
10 янв 18, 18:46    [21094590]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 44242
Пример - это часть табличной функции.
Остальные предположения проверю вечером, когда доберусь до компа.
10 янв 18, 18:54    [21094608]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3960
Yasha123,

тут бы тогда был вопрос не про медленный инсёрт, а "ВСЁ ТОРМОЗИТ СПАСИТЕ ПОМОГИТЕ" :)
10 янв 18, 18:55    [21094613]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 44242
Как я уже писал, простой инсерт во времянку ста строк летает
10 янв 18, 18:58    [21094622]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Andy_OLAP
Member

Откуда: я знаю, что Зенит - чемпион
Сообщений: 1465
andreymx,

А попробуйте оставить inner merge join, но только сделать null as Activity_AssignedToUser_sAMAccountName вместо pers.sAMAccountName as Activity_AssignedToUser_sAMAccountName...
10 янв 18, 19:16    [21094645]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 605
andreymx
Как я уже писал, простой инсерт во времянку ста строк летает

офигеть. сравнили
SELECT top 100
и
5 join + 1 merge join к табличной функции (не факт, что инлайн)
c WHERE и (возможно|скорее всего) без индексов
...
да у вас может быть все что угодно, начиная spooling и заканчивая серверной волчанкой.
...
Если нет доступа к SHOWPLAN,
добавьте к обоим запросам статистику по IO
и OPTION ( MAXDOP 1 )
добавьте, как рекомендовали, третий запрос на вставку в #activities
10 янв 18, 19:21    [21094653]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 727
andreymx
Как я уже писал, простой инсерт во времянку ста строк летает

вы же вставили всего 1 страницу, а вы вставьте не наллы, а что-то типа replicate(N'a', 4000)
10 янв 18, 19:27    [21094667]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
invm
Member

Откуда: Москва
Сообщений: 7550
andreymx,

Без инсерта у вас параллельный план - CPU много больше elapsed. Поэтому и секунда вместо трех.
10 янв 18, 19:28    [21094670]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Yasha123
Member

Откуда:
Сообщений: 727
Руслан Дамирович
andreymx
Как я уже писал, простой инсерт во времянку ста строк летает

офигеть. сравнили
SELECT top 100
и
5 join + 1 merge join к табличной функции (не факт, что инлайн)
c WHERE и (возможно|скорее всего) без индексов
...
да у вас может быть все что угодно, начиная spooling и заканчивая серверной волчанкой.
...
Если нет доступа к SHOWPLAN,
добавьте к обоим запросам статистику по IO
и OPTION ( MAXDOP 1 )
добавьте, как рекомендовали, третий запрос на вставку в #activities

нет, не так.
он сравнл просто селект того же самого, где 5 join и еще что-то со вставкой **того же самого** в переменную
10 янв 18, 19:30    [21094676]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Andy_OLAP
Member

Откуда: я знаю, что Зенит - чемпион
Сообщений: 1465
invm,
Помнится, как-то в 2012-м Поль Уайт объяснял, что очень не любит движок делать параллельные merge join.
Тамправда шла речь о "There are ways to achieve running whole query plans on multiple threads over exclusive data set ranges, but they require trickery that not everyone will be happy with (and will not be supported by Microsoft or guaranteed to work in the future)" касательно секционированных таблиц, но все же.
10 янв 18, 19:37    [21094684]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 44242
invm
andreymx,

Без инсерта у вас параллельный план - CPU много больше elapsed. Поэтому и секунда вместо трех.
что-то похожее приходило голову
10 янв 18, 19:51    [21094707]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 44242
invm
andreymx,

Без инсерта у вас параллельный план - CPU много больше elapsed. Поэтому и секунда вместо трех.
похоже, всё так и есть

добавил в запрос OPTION (MAXDOP 1), и оба варианта начали работать по три сек

добавление же OPTION (MAXDOP 3) инсерт не ускорило
10 янв 18, 23:03    [21095065]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 44242
переписал на курсор - стало быстро, одна сек
но не нравится эта куча полей и переменных, в оракле всё-таки курсоры удобнее

ЗЫ: оставлю в памяти на всякий случай
10 янв 18, 23:20    [21095106]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 881
andreymx
переписал на курсор - стало быстро, одна сек

Честно, фейспалм. Вам же сказали что вставка в табличную переменную будет последовательной всегда. Во временную таблицу может быть парелелльной. От того что Вы напишете MAXPOD 3 это не заставит сиквел юзать параллелизм. Для этого хинты используются другие.
11 янв 18, 11:14    [21096123]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
LSV
Member

Откуда: Киев
Сообщений: 30220
Табличные переменные очень медленные. Используй только в крайних случаях.
Обычные времянки рулят.

зы: привет
11 янв 18, 11:25    [21096182]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 44242
AlanDenton
andreymx
переписал на курсор - стало быстро, одна сек

Честно, фейспалм. Вам же сказали что вставка в табличную переменную будет последовательной всегда. Во временную таблицу может быть парелелльной. От того что Вы напишете MAXPOD 3 это не заставит сиквел юзать параллелизм. Для этого хинты используются другие.
спасибо, подумаю, удачи
11 янв 18, 11:25    [21096186]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 44242
LSV
Табличные переменные очень медленные. Используй только в крайних случаях.
Обычные времянки рулят.

зы: привет
мне нужна функция, возвращающая табличные данные

Или даже так:
мне необходимо сформировать отчет, в котором очень много формирований, данные из разных источников (таблиц и вьюх)
Обычной вьюхой можно нарисовать, но будет очень громоздко и несопровождаемо

вот хочу разбить формирования по процедурам или функциям

Советуйте, как правильно
11 янв 18, 12:18    [21096539]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить