powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
51 сообщений из 51, показаны все 3 страниц
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39581980
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
визуально - секунда против трех

запрос
Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
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');



без вставки во времянку
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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. 

со вставкой во времянку
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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)


С уважением, Андрей
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39581986
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
причем такая хрень работает моментально
Код: 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.
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
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39581989
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к сожалению, план посмотреть не могу... прав не дали
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39581992
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так сколько страниц в результате занимает первая переменная и сколько вторая?

т.е. вторая это всяко 1 страница,
а 8 строк, где каждай строка (возможно) по полстраницы,
это 8 строк, да еще и не в dedicated extent, а в mixed.
т.е. вообще может быть в 8 разных экстентах,
и все это надо аллокейтить
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39581996
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

ну прям выделение страниц столько времени это аномально. Я бы грешил на переменную таблицу, смените на веременную
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39581997
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxк сожалению, план посмотреть не могу... прав не дали
по-вашему что, просто селект и инсерт того же селекта в переменную еще и разные планы имеет?
ну кроме самого оператора инсерта, разумеется, которого нет в первом плане
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582000
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,
может у него офигительнейшая нагрузка на темпдб,
которая еще и в одном файле живет.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582004
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKYasha123,

ну прям выделение страниц столько времени это аномально. Я бы грешил на переменную таблицу, смените на веременную
кстати, что вообще за удивление такое,
tempdb contention это очень даже распространенное явление,
как раз из-за вот таких мелкопакостных аллокейшенов в <= 8 страниц
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582009
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention
чисто для ознакомления.
если у него нет showplan,
то кого уже мониторить ожидания на темпдб.
---
еще мою гипотезу можно проверить так:
запустить тот же код для временной таблицы
и для постоянной.
и вот если временная все тот же тормоз, то это оно
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582013
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример - это часть табличной функции.
Остальные предположения проверю вечером, когда доберусь до компа.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582014
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

тут бы тогда был вопрос не про медленный инсёрт, а "ВСЁ ТОРМОЗИТ СПАСИТЕ ПОМОГИТЕ" :)
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582017
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я уже писал, простой инсерт во времянку ста строк летает
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582026
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

А попробуйте оставить inner merge join, но только сделать null as Activity_AssignedToUser_sAMAccountName вместо pers.sAMAccountName as Activity_AssignedToUser_sAMAccountName...
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582028
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxКак я уже писал, простой инсерт во времянку ста строк летает
офигеть. сравнили
SELECT top 100
и
5 join + 1 merge join к табличной функции (не факт, что инлайн)
c WHERE и (возможно|скорее всего) без индексов
...
да у вас может быть все что угодно, начиная spooling и заканчивая серверной волчанкой.
...
Если нет доступа к SHOWPLAN,
добавьте к обоим запросам статистику по IO
и OPTION ( MAXDOP 1 )
добавьте, как рекомендовали, третий запрос на вставку в #activities
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582034
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxКак я уже писал, простой инсерт во времянку ста строк летает
вы же вставили всего 1 страницу, а вы вставьте не наллы, а что-то типа replicate(N'a', 4000)
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582035
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

Без инсерта у вас параллельный план - CPU много больше elapsed. Поэтому и секунда вместо трех.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582038
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичandreymxКак я уже писал, простой инсерт во времянку ста строк летает
офигеть. сравнили
SELECT top 100
и
5 join + 1 merge join к табличной функции (не факт, что инлайн)
c WHERE и (возможно|скорее всего) без индексов
...
да у вас может быть все что угодно, начиная spooling и заканчивая серверной волчанкой.
...
Если нет доступа к SHOWPLAN,
добавьте к обоим запросам статистику по IO
и OPTION ( MAXDOP 1 )
добавьте, как рекомендовали, третий запрос на вставку в #activities
нет, не так.
он сравнл просто селект того же самого, где 5 join и еще что-то со вставкой **того же самого** в переменную
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582040
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)" касательно секционированных таблиц, но все же.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582049
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmandreymx,

Без инсерта у вас параллельный план - CPU много больше elapsed. Поэтому и секунда вместо трех.что-то похожее приходило голову
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582124
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmandreymx,

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

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

добавление же OPTION (MAXDOP 3) инсерт не ускорило
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582129
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переписал на курсор - стало быстро, одна сек
но не нравится эта куча полей и переменных, в оракле всё-таки курсоры удобнее

ЗЫ: оставлю в памяти на всякий случай
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582328
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxпереписал на курсор - стало быстро, одна сек
Честно, фейспалм. Вам же сказали что вставка в табличную переменную будет последовательной всегда. Во временную таблицу может быть парелелльной. От того что Вы напишете MAXPOD 3 это не заставит сиквел юзать параллелизм. Для этого хинты используются другие.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582338
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Табличные переменные очень медленные. Используй только в крайних случаях.
Обычные времянки рулят.

зы: привет
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582340
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDentonandreymxпереписал на курсор - стало быстро, одна сек
Честно, фейспалм. Вам же сказали что вставка в табличную переменную будет последовательной всегда. Во временную таблицу может быть парелелльной. От того что Вы напишете MAXPOD 3 это не заставит сиквел юзать параллелизм. Для этого хинты используются другие.спасибо, подумаю, удачи
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582411
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVТабличные переменные очень медленные. Используй только в крайних случаях.
Обычные времянки рулят.

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

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

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

Советуйте, как правильно
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582469
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
inner merge JOIN dbo.get_table_persons(@p_samAccountName) 


Яб вот это вынес в отдельную времянку и джойнил бы на нее. И почему merge, get_table_persons возвращает примерно столько же сколько в WorkItemAssignedToUserFactvw?

Код: sql
1.
2.
ISNULL(A.IsDeleted, 0) = 0
  AND isnull(AStatus.ActivityStatusValue, ' ') not in ('Completed', 'Skipped');


Скаляр в предикате, к успеху идёшь! (нет)
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582481
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxСоветуйте, как правильноЯ делаю так:
Для получения сложного сводного отчета н-р 30-40 колонок с суммами.
Это всегда ХП.

0. Делаю список вспомогательных переменных.
1. сначала формирую пустую времянку # нужной структуры (обычно набор ключей и полей для суммовых значений)
2. Наполняю ее в неск. этапов. Где возможно, сразу заполняю суммовые значения.
3. Потом формирую неск. времянок для различных промежуточных результатов. Наполняю их.
4. Делаю несколько апдейтов сумм из п.2 с помощью п.3
5. Опционально удаляю мусор и ненужные данные, кот. иногда вынужденно попадают в результат (н-р дубли данных из разных документов, пустые или несущественные суммы)
6. Вывод окончательного результата: связывание ключей со справочниками, окончательное формирование и форматирование результатов.
(профит)

Почему именно так ?
1. Текст ХП имеет четкую, читабельную структуру и разбит на несложные части (с коментами)
2. Легко дополнить новыми расчетами.
3. Удобно отлаживать, т.к. можно выделить нужный кусок кода, а остальное отключить.
4. Легко накатить новую версию ХП на продакшн/тест и заново запустить отчет.

Вью стараюсь избегать, т.к. изменение ее структуры "не сразу доходит до пользователя". :)
Если она активно занята в вычислениях, то ее трудно заменить на другую.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582499
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне надо заполнить времянку пятью или шестью разными группами строк
под каждую группу свой алгоритм
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582729
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если не предполагается повторное использование кода этих алгоритмов, то делаешь всё в одной проце. так намного удобнее.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582737
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гигабайт Мегабайтович Килобайтовесли не предполагается повторное использование кода этих алгоритмов, то делаешь всё в одной проце. так намного удобнее.запросов, как в первом посте, будет десятка полтора
причем в первом посте он упрощен раза в два по сравнению с рабочим
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582738
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

да без разницы - пишешь большую портянку с сохранением промежуточных результатов, а потом выводишь как тебе надо. Весь вопрос в надобности использовать повторно эти алгоритмы в других процах. Вот тогда и возникают кучи разных вариантов..
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582739
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гигабайт Мегабайтович Килобайтовandreymx,

да без разницы - пишешь большую портянку с сохранением промежуточных результатов, а потом выводишь как тебе надо. Весь вопрос в надобности использовать повторно эти алгоритмы в других процах. Вот тогда и возникают кучи разных вариантов..а каждый запрос работает 10 сек
чтобы отладить 15-ый, ждешь каждый раз 2 минуты

да и рыться в портянках - ну его
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582742
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в оракле намного проще такие работы делать через глобальную времянку
глобальную времянку заполняешь пакетом процедур или любой из них
чистишь времянку тогда, когда удобно, а не как задумал разработчик СУБД
видимость глобальной времянки везде, а в таком случае это большой плюс
время на отладку и сопровождение снижается в разы
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582763
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

Оракл провоцирует писать плохой код... Ораклисты у нас такого наг-нокодили, что уже много лет разгребаем. Извините, не сдержался :)
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582768
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовОракл провоцирует писать плохой код... Ораклисты у нас такого наг-нокодили, что уже много лет разгребаем. Извините, не сдержался :)
Виноват-то не инструмент. Уж вы-то должны понимать.
Губит людей не пиво (с) :)

Другое дело, что вот переходят такие cursorнутые ораклисты в ms sql и требуют императивного программирования да побольше.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582769
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, скуль сервер запрещает делать глобальные времянки? Уверен, что нет.

Другое дело, что это подход через ()), ну вы поняли.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582794
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
use tempdb;
go

create procedure dbo.p1
 @p1 int,
 @p2 int,
 @p3 int
as
begin
 set nocount on;

 select top (5) object_id, name from sys.objects where type in ('U', 'S');
end;
go

create procedure dbo.p2
 @p1 int
as
begin
 set nocount on;

 select top (5) object_id, name from sys.objects where type in ('V');
end;
go

create procedure dbo.p3
as
begin
 set nocount on;

 create table #result (id int, name sysname);

 insert into #result
  (id, name)
  exec dbo.p1 1, 2, 3;

 insert into #result
  (id, name)
  exec dbo.p2 1;

 select id, name from #result;
end;
go

exec dbo.p3;
go

drop procedure p1, p2, p3;
go

...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582835
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileА что, скуль сервер запрещает делать глобальные времянки? Уверен, что нет.

Другое дело, что это подход через ()), ну вы поняли.а вы понимаете разницу между оракловой глобальной времянкой и скульной?
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582921
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxCammomileА что, скуль сервер запрещает делать глобальные времянки? Уверен, что нет.

Другое дело, что это подход через ()), ну вы поняли.а вы понимаете разницу между оракловой глобальной времянкой и скульной?А вы понимаете, что не все здесь должны быть в курсе, как там в оракле все устроено?
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582979
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевичandreymxпропущено...
а вы понимаете разницу между оракловой глобальной времянкой и скульной?А вы понимаете, что не все здесь должны быть в курсе, как там в оракле все устроено?если человек предлагает аналог, он же разбирается в этом?
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39582993
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxА вы понимаете, что не все здесь должны быть в курсе, как там в оракле все устроено?если человек предлагает аналог, он же разбирается в этом?[/quot]
Ну так вы первый начали - захотели курсоров в MS SQLе и LOOPного синтаксиса к ним в придачу.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39583037
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамирович,
не, это всё наносное :)

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

С уважением, Андрей
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39583045
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxМне нужен практический совет (бест практис) по реализации задачи - получение данных сложного отчета из кучи непростых юнионов

BEST-практисес без конкретной задачи - это сферическое зло в вакууме.

И тебе уже дали на основе того, что ты нам рассказал - BEST-солюшен 21096909
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39583244
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичBEST-практисес без конкретной задачи - это сферическое зло в вакууме.
укрупненный алгоритм получения данных


1. pers = сервисный подзапрос для получения списка подчиненных
2. bs = сервисный подзапрос для получения списка услуг

3. запрос для получения данных из источника 1 с учетом pers
4. запрос для получения данных из источника 1 с учетом bs
5. апдейт данных 1

6. запрос для получения данных из источника 2 с учетом pers
7. запрос для получения данных из источника 2 с учетом bs
8. апдейт данных 2

9. запрос для получения данных из источника 3 с учетом pers
10. запрос для получения данных из источника 3 с учетом bs
11. апдейт данных 3

каждый из запросов/подзапросов - строк 100-200 кода, время выполнения каждого - 5-10 сек
запросы для получения данных с учетом pers и с учетом bs слишком разные, чтобы объединять

Итог
12. SELECT общих данных пользователю в отчет
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39583333
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxРуслан ДамировичBEST-практисес без конкретной задачи - это сферическое зло в вакууме.
укрупненный алгоритм получения данных


1. pers = сервисный подзапрос для получения списка подчиненных
2. bs = сервисный подзапрос для получения списка услуг

3. запрос для получения данных из источника 1 с учетом pers
4. запрос для получения данных из источника 1 с учетом bs
5. апдейт данных 1

6. запрос для получения данных из источника 2 с учетом pers
7. запрос для получения данных из источника 2 с учетом bs
8. апдейт данных 2

9. запрос для получения данных из источника 3 с учетом pers
10. запрос для получения данных из источника 3 с учетом bs
11. апдейт данных 3

каждый из запросов/подзапросов - строк 100-200 кода, время выполнения каждого - 5-10 сек
запросы для получения данных с учетом pers и с учетом bs слишком разные, чтобы объединять

Итог
12. SELECT общих данных пользователю в отчет
вот так и в прямую и пишешь ))
а как проще разрабатывать - так это каждый определяет для себя ))

я в похожих случаях не пишу сразу процу, а сначала в скрипте всё пошагово отлаживаю, и только в итоге заворачиваю в процу.
п.с. если в скрипте написать create table #.... и явно не удалять созданную таблицу, то она живёт до тех, пор пока живёт текущий коннекшен - получаем что-то похожие на поведение глобальных таблиц в оракле.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39583334
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гигабайт Мегабайтович Килобайтов,

а можно таблицу создать до вызова процедуры
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39583379
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боевые ораклисты, наверное, не в курсе области видимости временных таблиц.
При этом, чисто технически, ничего не мешает в раках процедуры DoThings на верхнем уровне сделать времянку, а потому внутри нее разнызыми другими процками к этой времянке обращаться.
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39583429
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileБоевые ораклисты, наверное, не в курсе области видимости временных таблиц.
При этом, чисто технически, ничего не мешает в раках процедуры DoThings на верхнем уровне сделать времянку, а потому внутри нее разными другими процками к этой времянке обращаться.на уровне идеи это продумывалось, но на уровне реализации ничего реального в голову не приходит
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39583444
dies irae
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гигабайт Мегабайтович Килобайтовесли в скрипте написать create table #.... и явно не удалять созданную таблицу, то она живёт до тех, пор пока живёт текущий коннекшен - получаем что-то похожие на поведение глобальных таблиц в оракле.

так ведут себя ##таблицы (которые вообще очень редко должны использоваться)

а #таблицы, созданные в процедуре, удаляются по её завершении
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39583448
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dies iraeГигабайт Мегабайтович Килобайтовесли в скрипте написать create table #.... и явно не удалять созданную таблицу, то она живёт до тех, пор пока живёт текущий коннекшен - получаем что-то похожие на поведение глобальных таблиц в оракле.

так ведут себя ##таблицы (которые вообще очень редко должны использоваться)

а #таблицы, созданные в процедуре, удаляются по её завершении
вы не понимаете о чем он пишет
...
Рейтинг: 0 / 0
инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
    #39583476
dies irae
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKdies iraeпропущено...


так ведут себя ##таблицы (которые вообще очень редко должны использоваться)

а #таблицы, созданные в процедуре, удаляются по её завершении
вы не понимаете о чем он пишет

сори, прочитал как "если в скрипте процедуре написать create table #..."
...
Рейтинг: 0 / 0
51 сообщений из 51, показаны все 3 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]