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

Откуда:
Сообщений: 1212
inner merge JOIN dbo.get_table_persons(@p_samAccountName) 

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

ISNULL(A.IsDeleted, 0) = 0
  AND isnull(AStatus.ActivityStatusValue, ' ') not in ('Completed', 'Skipped');

Скаляр в предикате, к успеху идёшь! (нет)
11 янв 18, 13:20    [21096909]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
andreymx
Советуйте, как правильно
Я делаю так:
Для получения сложного сводного отчета н-р 30-40 колонок с суммами.
Это всегда ХП.

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

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

Вью стараюсь избегать, т.к. изменение ее структуры "не сразу доходит до пользователя". :)
Если она активно занята в вычислениях, то ее трудно заменить на другую.
11 янв 18, 13:37    [21097038]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53736
мне надо заполнить времянку пятью или шестью разными группами строк
под каждую группу свой алгоритм
11 янв 18, 14:03    [21097181]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
если не предполагается повторное использование кода этих алгоритмов, то делаешь всё в одной проце. так намного удобнее.
11 янв 18, 18:09    [21098672]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53736
Гигабайт Мегабайтович Килобайтов
если не предполагается повторное использование кода этих алгоритмов, то делаешь всё в одной проце. так намного удобнее.
запросов, как в первом посте, будет десятка полтора
причем в первом посте он упрощен раза в два по сравнению с рабочим
11 янв 18, 18:19    [21098685]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
andreymx,

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

Откуда: Запорожье
Сообщений: 53736
Гигабайт Мегабайтович Килобайтов
andreymx,

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

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

Откуда: Запорожье
Сообщений: 53736
в оракле намного проще такие работы делать через глобальную времянку
глобальную времянку заполняешь пакетом процедур или любой из них
чистишь времянку тогда, когда удобно, а не как задумал разработчик СУБД
видимость глобальной времянки везде, а в таком случае это большой плюс
время на отладку и сопровождение снижается в разы
11 янв 18, 18:27    [21098710]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
andreymx,

Оракл провоцирует писать плохой код... Ораклисты у нас такого наг-нокодили, что уже много лет разгребаем. Извините, не сдержался :)
11 янв 18, 18:58    [21098786]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Владислав Колосов
Оракл провоцирует писать плохой код... Ораклисты у нас такого наг-нокодили, что уже много лет разгребаем. Извините, не сдержался :)

Виноват-то не инструмент. Уж вы-то должны понимать.
Губит людей не пиво (с) :)

Другое дело, что вот переходят такие cursorнутые ораклисты в ms sql и требуют императивного программирования да побольше.
11 янв 18, 19:06    [21098802]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
А что, скуль сервер запрещает делать глобальные времянки? Уверен, что нет.

Другое дело, что это подход через ()), ну вы поняли.
11 янв 18, 19:06    [21098805]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
invm
Member

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

+
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
11 янв 18, 20:06    [21098911]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53736
Cammomile
А что, скуль сервер запрещает делать глобальные времянки? Уверен, что нет.

Другое дело, что это подход через ()), ну вы поняли.
а вы понимаете разницу между оракловой глобальной времянкой и скульной?
11 янв 18, 21:23    [21099069]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36695
andreymx
Cammomile
А что, скуль сервер запрещает делать глобальные времянки? Уверен, что нет.

Другое дело, что это подход через ()), ну вы поняли.
а вы понимаете разницу между оракловой глобальной времянкой и скульной?
А вы понимаете, что не все здесь должны быть в курсе, как там в оракле все устроено?
12 янв 18, 00:37    [21099475]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53736
Гавриленко Сергей Алексеевич
andreymx
пропущено...
а вы понимаете разницу между оракловой глобальной времянкой и скульной?
А вы понимаете, что не все здесь должны быть в курсе, как там в оракле все устроено?
если человек предлагает аналог, он же разбирается в этом?
12 янв 18, 08:02    [21099692]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
andreymx
А вы понимаете, что не все здесь должны быть в курсе, как там в оракле все устроено?
если человек предлагает аналог, он же разбирается в этом?[/quot]
Ну так вы первый начали - захотели курсоров в MS SQLе и LOOPного синтаксиса к ним в придачу.
12 янв 18, 08:56    [21099762]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53736
Руслан Дамирович,
не, это всё наносное :)

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

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

Откуда: Резиновая нерезиновая
Сообщений: 940
andreymx
Мне нужен практический совет (бест практис) по реализации задачи - получение данных сложного отчета из кучи непростых юнионов


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

И тебе уже дали на основе того, что ты нам рассказал - BEST-солюшен 21096909
12 янв 18, 09:59    [21099982]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53736
Руслан Дамирович
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 общих данных пользователю в отчет
12 янв 18, 12:46    [21100970]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
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 #.... и явно не удалять созданную таблицу, то она живёт до тех, пор пока живёт текущий коннекшен - получаем что-то похожие на поведение глобальных таблиц в оракле.
12 янв 18, 14:41    [21101699]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Гигабайт Мегабайтович Килобайтов,

а можно таблицу создать до вызова процедуры
12 янв 18, 14:44    [21101715]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
Боевые ораклисты, наверное, не в курсе области видимости временных таблиц.
При этом, чисто технически, ничего не мешает в раках процедуры DoThings на верхнем уровне сделать времянку, а потому внутри нее разнызыми другими процками к этой времянке обращаться.
12 янв 18, 16:18    [21102163]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53736
Cammomile
Боевые ораклисты, наверное, не в курсе области видимости временных таблиц.
При этом, чисто технически, ничего не мешает в раках процедуры DoThings на верхнем уровне сделать времянку, а потому внутри нее разными другими процками к этой времянке обращаться.
на уровне идеи это продумывалось, но на уровне реализации ничего реального в голову не приходит
12 янв 18, 17:23    [21102466]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
dies irae
Member

Откуда:
Сообщений: 78
Гигабайт Мегабайтович Килобайтов
если в скрипте написать create table #.... и явно не удалять созданную таблицу, то она живёт до тех, пор пока живёт текущий коннекшен - получаем что-то похожие на поведение глобальных таблиц в оракле.


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

а #таблицы, созданные в процедуре, удаляются по её завершении
12 янв 18, 17:46    [21102548]     Ответить | Цитировать Сообщить модератору
 Re: инсерт во времянку намного медленнее, чем просто запрос (возвращает 8 строк)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
dies irae
Гигабайт Мегабайтович Килобайтов
если в скрипте написать create table #.... и явно не удалять созданную таблицу, то она живёт до тех, пор пока живёт текущий коннекшен - получаем что-то похожие на поведение глобальных таблиц в оракле.


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

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

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