powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как рассчитать время выполнения запроса sql
16 сообщений из 16, страница 1 из 1
как рассчитать время выполнения запроса sql
    #39717035
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица, в ней 11 млн строк и 5 полей
есть запрос

Код: 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.
;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



выполняется уже один день. Сейчас мне понадобилось сервак перегрузить. Потом опять запущу, но хотелось бы узнать сколько он будет шуршат то. День это много.
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717036
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проц xeon cpu e5 2630 2,3Ghz
при выполнении запроса, он на 99% занят, хотя другие приложения не работают.
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717039
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может день, может год, может, вообще никогда не выполнится. Если не хотите анализировать предварительный план, ждите или позовите гадалку.
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717049
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как план проанализировать?
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717051
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну подберите условие, чтоб не все лопатил не всю таблицу, а сотню строк.
Потом тыщу. Потом сто тыщ. 200 тыщ и так далее, если он вообще на сотне сработает
Может у вас там вообще картезианский продукт (не смотрел) :D
Ну и статистику понятно...
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717053
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KontoxА как план проанализировать?Головой.
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717086
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичМожет день, может год, может, вообще никогда не выполнится. Если не хотите анализировать предварительный план, ждите или позовите гадалку.

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

Надо быть слепорожденным, шоб не видеть: 11 млн группировок и жменя outer apply-ев, вкупе с нумерацией и сортировкой... тут и недели маловато будет.
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717091
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontox,

чувак, с тебя за нажатие пробела/табуляции из зарплаты высчитывают, чтоле ??
Нуу как так можно форматировать эту срань которую ты "запросом" называешь ?!
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717101
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, странноватый запрос.
Может напишешь, что надо получить, так легче будет понять.
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717129
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontox,

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

Ещё есть ощущение, что всякие prvgrp/nxtgrp можно сделать с помощю lag lead.
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717253
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если там одно ядро и гиг памяти, то он и десять лет будет обрабатывать такой запрос.
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717263
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontox,

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

Судя по использованию PERCENTILE_DISC(), у вас как минимум 2012, значит стоит посмотреть в сторону LAG() / LEAD(). Глядишь, и сами свой код понимать начнете.
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717284
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizzaЕщё есть ощущение, что всякие prvgrp/nxtgrp можно сделать с помощю lag lead.
Ennor Tiegaelстоит посмотреть в сторону LAG() / LEAD().

Если action - не битовое, а может принимать значений сильно больше, чем 0 или 1, то LEAD/LAG тут не сильно-то и поможет....
ТС же через аплаи получает ближайшие сверху и снизу строки, со значением Action = 0, а не просто предыдущую и последующую строки относительно текущей...
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717299
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

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

при этом в первом же сте
Код: plaintext
partition by [item],code,action
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717360
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizza,

в принципе, для избавления от тех двух аплаев, что вычисляют ближайшие группы с нулевым экшином, можно использовать оконно-аналитический MAX / MIN. Нужно лишь "заточить" его под трюк со склейкой даты и номера группы, а в самый первый CTE вкорячить CASE, для обNULLения значений GRP для строк, где ACTION != 0...
Но без тестовых данных составлять запрос - лениво...
...
Рейтинг: 0 / 0
как рассчитать время выполнения запроса sql
    #39717951
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Покажите реальный план выполенния:

Код: 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.
50.
51.
52.
53.
54.
55.
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
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как рассчитать время выполнения запроса sql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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