Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 виснет сервер  [new]
Asic
Member

Откуда:
Сообщений: 45
Добрый день.
Может кто подскажет, как быть в данной ситуации?
Запрос убивает сервер при его выполнении. Запрос в результате имеет > 4млн. строк
Собственно вот сам запрос и его план выполнения:
select t1.Id, t1.Names, t2.Id, t2.Num,
  t2.Typ, t2.nt, t3.Typ, t2.DateStart, t2.DateEnd,
  t4.Names,
  '^'+t3.cost cost1,
  dbo.f_rc2(t2.cost,t2.cost2) costdegree
from t4, t2, t1, t3
where t4.Id=t2.Id
  and t2.Id=t1.Id
  and t4.Id=t3.Id
and t3.Typ in(1)
order by t1.Names


К сообщению приложен файл (plan.sqlplan - 95Kb) cкачать
11 янв 19, 13:30    [21782777]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36009
Ну, купите сервер помощнее. Или запрос не запускате. Или считайте частями, чтобы и остальным ресурсов оставалось.

Короче, зависит от того, чего вы хотите в итоге добиться.
11 янв 19, 13:36    [21782785]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
Yasha123
Member

Откуда:
Сообщений: 1285
не сортируйте свои 4млн
11 янв 19, 13:45    [21782797]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
Владислав Колосов
Member

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

у вас персоналка на 4 ядра?
11 янв 19, 16:59    [21783072]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Asic,

Для таблицы t2 для начала вызываете функцию f_rc2(t2.cost,t2.cost2) и записываете полученный результат в таблицу t2, в новый столбец f_rc2_result.

А затем запускаете свой запрос, заменив вызов функции на использование ранее просчитанного столбца.
11 янв 19, 17:09    [21783097]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27906
Andy_OLAP
Для таблицы t2 для начала вызываете функцию f_rc2(t2.cost,t2.cost2) и записываете полученный результат в таблицу t2, в новый столбец f_rc2_result.

А затем запускаете свой запрос, заменив вызов функции на использование ранее просчитанного столбца.
Или, если в t2 много строк, нужно вместо функции использовать выражение, либо переписать функцию на inline.
11 янв 19, 20:50    [21783290]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27906
Владислав Колосов
Asic,

у вас персоналка на 4 ядра?
Скалярные функции вызываются медленно, неразумно покупать дорогой сервер и лицензии, если можно за 5 минут повысить скорость в сотню или тысячу раз. Хотя, если зарплата админов считается как процент от железа, как у строителей, то...
11 янв 19, 20:53    [21783297]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27906
alexeyvg
Владислав Колосов
Asic,

у вас персоналка на 4 ядра?
Скалярные функции вызываются медленно, неразумно покупать дорогой сервер и лицензии, если можно за 5 минут повысить скорость в сотню или тысячу раз. Хотя, если зарплата админов считается как процент от железа, как у строителей, то...
Хотя сортировка там в темпдб, это тоже медленно...
Проще всего проверить, запустив запрос без функции.
11 янв 19, 20:58    [21783301]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 976
Asic,

у вас там SortSpill ворнинг,

Yasha123 правильно заметил, сортировку уберете быстрей будет, если все таки нужна тогда используйте временный буффер
+

drop table if exists #tmp;

select co.ContractorId, co.ContractorName, cg.ContractGroupId, cg.ContractNumber,
  cg.DaysBeforePaymentType, cg.DaysBeforePayment, cg.GoodsTypeGroup, cg.Datex, cg.DateEnd,
  c.GoodsId, g.GoodsName,
  cg.OrderSumMin, cg.MultiplePack, cg.MultiplePallet,
  '^'+g.Barcode1 Barcode1,
  '12345678901234567890' BarcodeAuto,
  c.DeliveryQuantityPackMin, c.DeliveryQuantityMin,
  c.ContractFirst, c.ContractPrice2, dbo.f_proc2(c.ContractFirst,c.ContractPrice2) PriceProc,
  c.LineNumber
  into #tmp
from Contractx c, ContractGroup cg, Contractor co, Goods g
where c.ContractGroupId=cg.ContractGroupId
  and cg.ContractorId=co.ContractorId
  and c.GoodsId=g.GoodsId
and cg.GoodsTypeGroup in(1)

select * from #tmp order by ContractorName, ContractGroupId, LineNumber
11 янв 19, 21:38    [21783330]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6267
alexeyvg
Владислав Колосов
Asic,

у вас персоналка на 4 ядра?
Скалярные функции вызываются медленно, неразумно покупать дорогой сервер и лицензии, если можно за 5 минут повысить скорость в сотню или тысячу раз. Хотя, если зарплата админов считается как процент от железа, как у строителей, то...


Каким образом вычисление запроса со скалярной функцией может, цитирую, "подвесить сервер"?
14 янв 19, 11:58    [21784587]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
Исраэль.
Member

Откуда:
Сообщений: 9
Про сортировку Вам всё правильно сказали.
Вы ж не хотите все 4 млн. кому-то показывать?
Свой селект замените на count(*).
Если отстрелит быстро-значит, индексы в порядке и
неполадка в самом селекте, о чём вам уже сказали.
А если застрянет на count(*) пересчитайте некласторные индексы.
По тупому, коммандой create index, без всяких утилит reindex, dbcc,
толку от них никакого.
14 янв 19, 17:46    [21785002]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6022
автор
Свой селект замените на count(*).
Если отстрелит быстро-значит, индексы в порядке и
неполадка в самом селекте

Ничоси(с)
14 янв 19, 17:51    [21785010]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36009
Исраэль.
А если застрянет на count(*) пересчитайте некласторные индексы.
По тупому, коммандой create index, без всяких утилит reindex, dbcc,
толку от них никакого.
Вы бредите.
14 янв 19, 17:53    [21785012]     Ответить | Цитировать Сообщить модератору
 Re: виснет сервер  [new]
Исраэль.
Member

Откуда:
Сообщений: 9
Ага, первый висяк разруливаю.
14 янв 19, 18:03    [21785030]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить