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

Откуда:
Сообщений: 146
Есть таблица, в ней 11 млн строк и 5 полей
есть запрос

;With CTE
AS
(
select *,
row_number() over (partition by [item],code order by [data])-row_number() over (partition by [item],code,action order by [data]) as grp
from test_median
),
CTE1
AS
(
SELECT *
FROM CTE c
OUTER APPLY
(
SELECT TOP 1 grp as prvgrp
FROM CTE
WHERE action = 0
AND data <= c.data
and [item] = c.[item]
and code = c.code
ORDER BY data DESC
) prev
OUTER APPLY
(
SELECT TOP 1 grp as nxtgrp
FROM CTE
WHERE action = 0
and [item] = c.[item]
and code = c.code
AND data >= c.data
ORDER BY data 
) nxt
)

SELECT c.item,c.code,c.data,c.sales,c.action,case when action = 1 and med < sales then med else sales end as output
FROM CTE1 c
OUTER APPLY (
SELECT MAX(med) AS med
FROM
(
SELECT PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY sales) OVER (PARTITION BY [item],code,grp) AS med
FROM CTE
WHERE grp IN (nxtgrp,prvgrp)
and [item] = c.[item]
and code = c.code
)r
)c2
order by data


выполняется уже один день. Сейчас мне понадобилось сервак перегрузить. Потом опять запущу, но хотелось бы узнать сколько он будет шуршат то. День это много.
13 окт 18, 12:06    [21703218]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
Kontox
Member

Откуда:
Сообщений: 146
проц xeon cpu e5 2630 2,3Ghz
при выполнении запроса, он на 99% занят, хотя другие приложения не работают.
13 окт 18, 12:11    [21703220]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
Может день, может год, может, вообще никогда не выполнится. Если не хотите анализировать предварительный план, ждите или позовите гадалку.
13 окт 18, 12:15    [21703223]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
Kontox
Member

Откуда:
Сообщений: 146
А как план проанализировать?
13 окт 18, 13:05    [21703244]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 306
Ну подберите условие, чтоб не все лопатил не всю таблицу, а сотню строк.
Потом тыщу. Потом сто тыщ. 200 тыщ и так далее, если он вообще на сотне сработает
Может у вас там вообще картезианский продукт (не смотрел) :D
Ну и статистику понятно...
13 окт 18, 13:09    [21703246]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
Kontox
А как план проанализировать?
Головой.
13 окт 18, 13:17    [21703248]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
aleks222
Member

Откуда:
Сообщений: 851
Гавриленко Сергей Алексеевич
Может день, может год, может, вообще никогда не выполнится. Если не хотите анализировать предварительный план, ждите или позовите гадалку.


Какой план?!! Зачем?

Надо быть слепорожденным, шоб не видеть: 11 млн группировок и жменя outer apply-ев, вкупе с нумерацией и сортировкой... тут и недели маловато будет.
13 окт 18, 15:01    [21703303]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
court
Member

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

чувак, с тебя за нажатие пробела/табуляции из зарплаты высчитывают, чтоле ??
Нуу как так можно форматировать эту срань которую ты "запросом" называешь ?!
13 окт 18, 15:39    [21703310]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Действительно, странноватый запрос.
Может напишешь, что надо получить, так легче будет понять.
13 окт 18, 16:25    [21703320]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
PizzaPizza
Member

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

Имеет смысл разобрать лесенку сте, выполнить отдельно и посмотреть планы выполнения. А то там может ад и Израиль в самом начале.

Ещё есть ощущение, что всякие prvgrp/nxtgrp можно сделать с помощю lag lead.
13 окт 18, 20:07    [21703387]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
Если там одно ядро и гиг памяти, то он и десять лет будет обрабатывать такой запрос.
14 окт 18, 14:44    [21703627]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
Ennor Tiegael
Member

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

Пытаетесь реализовать "Billion laughs attack" на SQL? Ну так есть проще способы.

Судя по использованию PERCENTILE_DISC(), у вас как минимум 2012, значит стоит посмотреть в сторону LAG() / LEAD(). Глядишь, и сами свой код понимать начнете.
14 окт 18, 15:29    [21703639]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
PizzaPizza
Ещё есть ощущение, что всякие prvgrp/nxtgrp можно сделать с помощю lag lead.

Ennor Tiegael
стоит посмотреть в сторону LAG() / LEAD().


Если action - не битовое, а может принимать значений сильно больше, чем 0 или 1, то LEAD/LAG тут не сильно-то и поможет....
ТС же через аплаи получает ближайшие сверху и снизу строки, со значением Action = 0, а не просто предыдущую и последующую строки относительно текущей...
14 окт 18, 18:01    [21703670]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Щукина Анна,

мда, там явно джойн на отдельную выборку с фильтрами
action = 0
AND data <= c.data
and [item] = c.[item]
and code = c.code

при этом в первом же сте
partition by [item],code,action
14 окт 18, 19:36    [21703692]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
Щукина Анна
Member

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

в принципе, для избавления от тех двух аплаев, что вычисляют ближайшие группы с нулевым экшином, можно использовать оконно-аналитический MAX / MIN. Нужно лишь "заточить" его под трюк со склейкой даты и номера группы, а в самый первый CTE вкорячить CASE, для обNULLения значений GRP для строк, где ACTION != 0...
Но без тестовых данных составлять запрос - лениво...
15 окт 18, 04:57    [21703812]     Ответить | Цитировать Сообщить модератору
 Re: как рассчитать время выполнения запроса sql  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Покажите реальный план выполенния:

IF OBJECT_ID('tempdb.dbo.#Data') IS NOT NULL
    DROP TABLE #Data

SELECT *
     , ROW_NUMBER() OVER (PARTITION BY [item], code ORDER BY [data]) - ROW_NUMBER() OVER (PARTITION BY [item], code, action ORDER BY [data]) AS grp
INTO #Data
FROM test_median

--CREATE CLUSTERED INDEX ix ([item], code, data) -- хз

;WITH CTE AS (
    SELECT *
    FROM #Data c
    OUTER APPLY (
        SELECT TOP(1) t.grp AS prvgrp
        FROM #Data t
        WHERE t.action = 0
            AND t.data <= c.data
            AND t.[item] = c.[item]
            AND t.code = c.code
        ORDER BY t.data DESC
    ) prev
    OUTER APPLY (
        SELECT TOP(1) t.grp AS nxtgrp
        FROM #Data
        WHERE t.action = 0
            AND t.[item] = c.[item]
            AND t.code = c.code
            AND t.data >= c.data
        ORDER BY t.data
    ) nxt
)

SELECT c.item
     , c.code
     , c.data
     , c.sales
     , c.action
     , CASE
           WHEN action = 1 AND
               med < sales THEN med
           ELSE sales
       END AS output
FROM CTE1 c
OUTER APPLY (
    SELECT MAX(med) AS med
    FROM (
        SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY sales) OVER (PARTITION BY [item], code, grp) AS med
        FROM #Data
        WHERE grp IN (nxtgrp, prvgrp)
            AND [item] = c.[item]
            AND code = c.code
    ) r
) c2
ORDER BY data


Из того что я вижу у вас в tempdb потенциально будет писаться куча хрени за счет использования оконных функций и особенно PERCENTILE_DISC
16 окт 18, 10:12    [21704804]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить