powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация запроса
41 сообщений из 41, показаны все 2 страниц
Оптимизация запроса
    #39630339
Чингис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дд как оптимизировать запрос?


к примеру

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT     derivedtbl_1.cAB, derivedtbl_1.kontr_id, derivedtbl_1.Strt_id, derivedtbl_2.cAB AS ns, derivedtbl_1.STRTNAME, derivedtbl_1.Kontroller_Name
FROM         (SELECT     COUNT(V_ved.ab_kart_oid) AS cAB, V_ved.kontr_id, V_ved.Strt_id, V_ved.STRTNAME, V_ved.Kontroller_Name
                       FROM          V_ved INNER JOIN
                                                  (SELECT     V_saldoN.Ab_kart_oid, T_nach_saldo.Date_pokaz
                                                    FROM          T_nach_saldo INNER JOIN
                                                                           V_saldoN ON T_nach_saldo.OID = V_saldoN.mxoid) AS TSMX ON V_ved.ab_kart_oid = TSMX.Ab_kart_oid
                       WHERE      (V_ved.ab_kart_oid BETWEEN 26808 AND 27008)
                       GROUP BY V_ved.kontr_id, V_ved.Strt_id, V_ved.STRTNAME, V_ved.Kontroller_Name) AS derivedtbl_1 LEFT OUTER JOIN
                         
                       
                        (SELECT     COUNT(V_ved_1.ab_kart_oid) AS cAB, V_ved_1.kontr_id, V_ved_1.Strt_id
                            FROM          V_ved AS V_ved_1 INNER JOIN
                                                       (SELECT     V_saldoN_1.Ab_kart_oid, T_nach_saldo_1.Date_pokaz
                                                         FROM          T_nach_saldo AS T_nach_saldo_1 INNER JOIN
                                                                                V_saldoN AS V_saldoN_1 ON T_nach_saldo_1.OID = V_saldoN_1.mxoid) AS TSMX_1 ON 
                                                   V_ved_1.ab_kart_oid = TSMX_1.Ab_kart_oid
                            WHERE      (V_ved_1.ab_kart_oid BETWEEN 26808 AND 27008) AND (TSMX_1.Date_pokaz NOT BETWEEN CONVERT(DATETIME, '2018-01-01 00:00:00', 102) AND 
                                                   CONVERT(DATETIME, '2018-02-01 00:00:00', 102))
                            GROUP BY V_ved_1.kontr_id, V_ved_1.Strt_id) AS derivedtbl_2 ON derivedtbl_1.Strt_id = derivedtbl_2.Strt_id AND 
                      derivedtbl_1.kontr_id = derivedtbl_2.kontr_id
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39630342
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, стоит:
- написать версию сервера?
- привести план запроса

ну и конструкции CONVERT(DATETIME, '2018-02-01 00:00:00', 102) вызывают некое недоумение...
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39630356
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чингис,
Для начала надо бы переписать запрос - для читабельности
гдет - так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
;WITH TSMX AS
(SELECT V_saldoN.Ab_kart_oid, T_nach_saldo.Date_pokaz
 FROM T_nach_saldo INNER JOIN V_saldoN ON T_nach_saldo.OID = V_saldoN.mxoid
), 
derivedtbl_1 AS
(SELECT COUNT(V_ved.ab_kart_oid) AS cAB, V_ved.kontr_id, V_ved.Strt_id, V_ved.STRTNAME, V_ved.Kontroller_Name
 FROM V_ved INNER JOIN TSMX ON V_ved.ab_kart_oid = TSMX.Ab_kart_oid
 WHERE (V_ved.ab_kart_oid BETWEEN 26808 AND 27008)
 GROUP BY V_ved.kontr_id, V_ved.Strt_id, V_ved.STRTNAME, V_ved.Kontroller_Name
)
derivedtbl_2 AS
(SELECT COUNT(V_ved_1.ab_kart_oid) AS cAB, V_ved_1.kontr_id, V_ved_1.Strt_id
 FROM V_ved AS V_ved_1 INNER JOIN TSMX AS TSMX_1 ON V_ved_1.ab_kart_oid = TSMX_1.Ab_kart_oid
 WHERE (V_ved_1.ab_kart_oid BETWEEN 26808 AND 27008) AND (TSMX_1.Date_pokaz NOT BETWEEN '20180101' AND '2018-02-01')
 GROUP BY V_ved_1.kontr_id, V_ved_1.Strt_id
)

SELECT derivedtbl_1.cAB, derivedtbl_1.kontr_id, derivedtbl_1.Strt_id, derivedtbl_2.cAB AS ns, derivedtbl_1.STRTNAME, derivedtbl_1.Kontroller_Name
FROM derivedtbl_1 LEFT OUTER JOIN derivedtbl_2 ON derivedtbl_1.Strt_id = derivedtbl_2.Strt_id AND 
                      derivedtbl_1.kontr_id = derivedtbl_2.kontr_id
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39630823
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чингис,

выполнение запроса оптимизируется не только по внешнему виду запроса, но и по составу и количеству данных.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631112
Чингис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52,

на счет with-a не знал первый раз вижу спс.
а если проц использовать?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631113
Чингис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка,

дд скл сервер 2005
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631330
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы бы для начала показали реальный план выполнения (и прикрепили его файлом sqlplan).
Показали статистику логических чтений. Какие индексы и тд. То так на глаз конечно можно, но мало эффективно будет.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631369
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чингис,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name,
 count(*) as cAB,
 nullif(sum(sum(case when a.Date_pokaz not between '20180101' and '20180201' then 1 else 0)) over (partition by c.kontr_id, c.Strt_id), 0) as ns
from
 T_nach_saldo a join
 V_saldoN b on a.OID = b.mxoid join
 V_ved c on c.ab_kart_oid = b.ab_kart_oid
where
 b.ab_kart_oid between 26808 and 27008
group by
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name;
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631427
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

"over (partition..." - как бы да, но у автора темы 2005-й, в чем он честно признался.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631446
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPкак бы да, но у автора темы 2005-й,Хотите сказать, что в 2005 нет предложения over? Уверены?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631473
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧингисДедушка,

дд скл сервер 2005

дд Чингис, вы часто используете "дд" , это что - "дурдом"?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631476
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmAndy_OLAPкак бы да, но у автора темы 2005-й,Хотите сказать, что в 2005 нет предложения over? Уверены?
Конечно, не уверен.

Просто зашел на официальную документацию и прочитал фразу "THIS TOPIC APPLIES TO: SQL Server (starting with 2008 )".

Но если работает на 2005-м - таки замечательно. Вы это лично проверяли?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631480
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Впрочем, можете не отвечать, вот здесь автор убедился, что на 2005-м работает.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631504
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPinvmпропущено...
Хотите сказать, что в 2005 нет предложения over? Уверены?
Конечно, не уверен.

Просто зашел на официальную документацию и прочитал фразу "THIS TOPIC APPLIES TO: SQL Server (starting with 2008 )".

Но если работает на 2005-м - таки замечательно. Вы это лично проверяли?
официальная документация
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631838
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Вы свою ссылку не открывали? Там прямо в верхей части страницы обычным шрифтом - " Это содержимое было выведено из использования и, возможно, не будет обновляться в будущем. Продукт, служба или технология, упомянутые в этом содержимом, больше не поддерживаются".
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631856
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPfelix_ff,

Вы свою ссылку не открывали? Там прямо в верхей части страницы обычным шрифтом - " Это содержимое было выведено из использования и, возможно, не будет обновляться в будущем. Продукт, служба или технология, упомянутые в этом содержимом, больше не поддерживаются".Прикольно. Наверно, это относится к версии сервера (SQL2005)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631883
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,

а вы считаете правильно смотреть документацию от продукта версией выше которая необходима?

для 2012 инстанса наверное в документацию к 2017 полезете? ну удачи.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39631984
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Коллега, поймите правильно - в официальной документации на OVER есть упоминание, что работает начиная с 2008-й версии. Но. Мы оба прекрасно понимаем, что веселые индусы в Редмонде просто поленились написать, что в 2005-м тоже работает, но не всё и не так кошерно.
Тем не менее - я привел актуальную ссылку, оговорив, что в реальности все немного не так, Вы кинули ссылку, в которой написана, что она устарела и никто не смотрит, что в ней осталось висеть.

Мы оба правы. Просто когда Вы кинете такую ссылку новичку на форуме, он прочтет в верхней части, что все устарело - и подумает про Вас плохо.

Я тоже когда думаю о Вас - думаю о Вас плохо, но по другой причине, не связанной с документацией на MSSQL...
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632037
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPпоймите правильно - в официальной документации на OVER есть упоминание, что работает начиная с 2008-й версии.Вам следует знать, что в актуальной документации не упоминаются версии, снятые с поддержки.
Для таких версий есть отдельная документация . В которой легко находится желаемое .
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632041
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Коллега, Вы же понимаете, что V_ved - это view, внутри которой строки из ОСВ с полями контрагента kontr_id и идентификатором Strt_id и сцепка со справочниками, из которых берутся STRTNAME и Kontroller_Name.

Далее идет присоединение по ab_kart_oid. Так может быть, не рекомендовать over, а таки совсем немного подумать и предложить автору темы заскриптовать view и выложить сюда, чтобы сначала сделать group by kontr_id ,Strt_id ,ab_kart_oid, а потом уже присоединять справочники.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632043
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Или Вы хотите научить молодого разработчика сложностям, а потом взять с него немного шекелей за платную консультацию, когда тормозить будет неожиданно сильнее, а он уже без наркомовских 100 грамм не поймет, что и как?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632064
Чингис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

это добрый день
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632065
Чингис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,

скиньте мне литературу
я оказ ограничился только Мартином Грубером
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632073
Чингис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmЧингис,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name,
 count(*) as cAB,
 nullif(sum(sum(case when a.Date_pokaz not between '20180101' and '20180201' then 1 else 0)) over (partition by c.kontr_id, c.Strt_id), 0) as ns
from
 T_nach_saldo a join
 V_saldoN b on a.OID = b.mxoid join
 V_ved c on c.ab_kart_oid = b.ab_kart_oid
where
 b.ab_kart_oid between 26808 and 27008
group by
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name;



ругается он

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ')'.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632075
Чингис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и как у вас все просто
у вас генератор оптимизатор или построитель скл установлен?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632076
Чингис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или с скля целыми днями не вылазиите
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632081
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧингисinvmЧингис,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name,
 count(*) as cAB,
 nullif(sum(sum(case when a.Date_pokaz not between '20180101' and '20180201' then 1 else 0)) over (partition by c.kontr_id, c.Strt_id), 0) as ns
from
 T_nach_saldo a join
 V_saldoN b on a.OID = b.mxoid join
 V_ved c on c.ab_kart_oid = b.ab_kart_oid
where
 b.ab_kart_oid between 26808 and 27008
group by
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name;



ругается он

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ')'.
потому что в case -е не хватает end :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name,
 count(*) as cAB,
 nullif(sum(sum(case when a.Date_pokaz not between '20180101' and '20180201' then 1 else 0 end)) over (partition by c.kontr_id, c.Strt_id), 0) as ns
from
 T_nach_saldo a join
 V_saldoN b on a.OID = b.mxoid join
 V_ved c on c.ab_kart_oid = b.ab_kart_oid
where
 b.ab_kart_oid between 26808 and 27008
group by
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name;


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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT     CASE WHEN (CASE WHEN TSMX.Saldo IS NULL THEN SALDOISNULL.saldo ELSE TSMX.Saldo END) > 0 THEN (CASE WHEN TSMX.Saldo IS NULL 
                      THEN SALDOISNULL.saldo ELSE TSMX.Saldo END) END AS DT, CASE WHEN (CASE WHEN TSMX.Saldo IS NULL THEN SALDOISNULL.Saldo ELSE TSMX.Saldo END) 
                      < 0 THEN (CASE WHEN TSMX.Saldo IS NULL THEN SALDOISNULL.Saldo ELSE TSMX.Saldo END) END AS KT, V_ved.Lis_schet
FROM         (SELECT     T_nach_saldo_1.Saldo, T_nach_saldo_1.Ab_kart_oid
                       FROM          (SELECT     MAX(OID) AS min_oid
                                               FROM          T_nach_saldo AS T_nach_saldo_2
                                               GROUP BY Ab_kart_oid) AS tsmin INNER JOIN
                                              T_nach_saldo AS T_nach_saldo_1 ON tsmin.min_oid = T_nach_saldo_1.OID
                       WHERE      (T_nach_saldo_1.Date_pokaz < CONVERT(DATETIME, '2018-04-01 00:00:00', 102))) AS SALDOISNULL RIGHT OUTER JOIN
                      V_ved ON SALDOISNULL.Ab_kart_oid = V_ved.ab_kart_oid LEFT OUTER JOIN
                          (SELECT     T_nach_saldo.Tarif, T_nach_saldo.Saldo, T_nach_saldo.Summa, T_nach_saldo.Date_pokaz, T_nach_saldo.Ab_kart_oid
                            FROM          T_nach_saldo INNER JOIN
                                                       (SELECT     MAX(OID) AS mxoid
                                                         FROM          T_nach_saldo AS T_nach_saldo_1
                                                         GROUP BY Ab_kart_oid) AS tsn ON T_nach_saldo.OID = tsn.mxoid
                            WHERE      (T_nach_saldo.Date_pokaz BETWEEN CONVERT(DATETIME, '2018-04-01 00:00:00', 102) AND CONVERT(DATETIME, '2018-04-17 00:00:00', 102))) 
                      AS TSMX ON V_ved.ab_kart_oid = TSMX.Ab_kart_oid
ORDER BY V_ved.ab_kart_oid
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632085
Чингис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123Чингиспропущено...


ругается он

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ')'.
потому что в case -е не хватает end :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name,
 count(*) as cAB,
 nullif(sum(sum(case when a.Date_pokaz not between '20180101' and '20180201' then 1 else 0 end)) over (partition by c.kontr_id, c.Strt_id), 0) as ns
from
 T_nach_saldo a join
 V_saldoN b on a.OID = b.mxoid join
 V_ved c on c.ab_kart_oid = b.ab_kart_oid
where
 b.ab_kart_oid between 26808 and 27008
group by
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name;


а вы бы не копипастили, а осознали б идею и сами писали,
не было бы таких ошибок.
а еще Andy_OLAP -- знатный пустомеля.
но т.к. звенит он тут порядочно, неопытные товарищи вроде вас клюют на сие пустозвонство.
неужели не видите, что он не только в версиях путается и документацию читать не умеет
(о чем ему вообще-то в этой теме несколько разных людей написало),
он еще и свою некомпетентность пытается прикрыть чем угодно?
куда только Гавриленко смотрит...


копи паст быстрее
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632088
Чингис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123Чингиспропущено...


ругается он

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ')'.
потому что в case -е не хватает end :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name,
 count(*) as cAB,
 nullif(sum(sum(case when a.Date_pokaz not between '20180101' and '20180201' then 1 else 0 end)) over (partition by c.kontr_id, c.Strt_id), 0) as ns
from
 T_nach_saldo a join
 V_saldoN b on a.OID = b.mxoid join
 V_ved c on c.ab_kart_oid = b.ab_kart_oid
where
 b.ab_kart_oid between 26808 and 27008
group by
 c.kontr_id, c.Strt_id, c.STRTNAME, c.Kontroller_Name;


а вы бы не копипастили, а осознали б идею и сами писали,
не было бы таких ошибок.
а еще Andy_OLAP -- знатный пустомеля.
но т.к. звенит он тут порядочно, неопытные товарищи вроде вас клюют на сие пустозвонство.
неужели не видите, что он не только в версиях путается и документацию читать не умеет
(о чем ему вообще-то в этой теме несколько разных людей написало),
он еще и свою некомпетентность пытается прикрыть чем угодно?
куда только Гавриленко смотрит...

шикарно обрабатывает 2-3 сек
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632092
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123а еще Andy_OLAP -- знатный пустомеля.
Анна, таки добрый вечер. Благодарю за термин "знатный", мое отношение к Вам резко поменялось по этой причине в положительную сторону.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632154
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чингисили с скля целыми днями не вылазиите
По нику "Чингис", вроде восточный чел., а воспитание хромает.
Было предложено супер решение - респект и уважуха за это.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632217
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPТак может быть, не рекомендовать over, а таки совсем немного подумать и предложить автору темы заскриптовать view и выложить сюда, чтобы сначала сделать group by kontr_id ,Strt_id ,ab_kart_oid, а потом уже присоединять справочники.Думать никогда не вредит. Особенно о том, что оптимизатор писали люди уж всяко не глупее себя любимого.
Специально для Andy_OLAP для изучения и осознания
Код: 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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
use tempdb;
go

create table dbo.r1 (r1_id int identity primary key, r1_Name varchar(200));
create table dbo.r2 (r2_id int identity primary key, r2_Name varchar(200));
create table dbo.r3 (r3_id int identity primary key, r3_Name varchar(200));
create table dbo.t (id int identity primary key, r1_id int not null references dbo.r1 (r1_id), r2_id int not null references dbo.r2 (r2_id), r3_id int not null references dbo.r3 (r3_id), v int);

insert into dbo.r1
 (r1_Name)
 select top (10)
  replicate(cast(newid() as varchar(36)), 5)
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.r2
 (r2_Name)
 select top (20)
  replicate(cast(newid() as varchar(36)), 5)
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.r3
 (r3_Name)
 select top (30)
  replicate(cast(newid() as varchar(36)), 5)
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.t
 (r1_id, r2_id, r3_id, v)
 select top (500000)
  rand(checksum(newid())) * 10 + 1,
  rand(checksum(newid())) * 20 + 1,
  rand(checksum(newid())) * 30 + 1,
  1
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;
go

declare @r1_Name varchar(200), @r2_Name varchar(200), @r3_Name varchar(200), @v int, @id uniqueidentifier, @q nvarchar(max);
declare @r table (row_order int identity, id uniqueidentifier primary key, descr varchar(100), m as '/*' + cast(id as varchar(36)) + '*/');

select @id = newid();
insert into @r values (@id, 'group by r1.r1_Name, r2.r2_Name, r3.r3_Name');

select @q = N'/*' + cast(@id as nvarchar(36)) + N'*/' +
N'declare @r1_Name varchar(200), @r2_Name varchar(200), @r3_Name varchar(200), @v int;

select
 @r1_Name = r1.r1_Name, @r2_Name = r2.r2_Name, @r3_Name = r3.r3_Name, @v = sum(v)
from
 dbo.t join
 dbo.r1 on r1.r1_id = t.r1_id join
 dbo.r2 on r2.r2_id = t.r2_id join
 dbo.r3 on r3.r3_id = t.r3_id
group by
 r1.r1_Name, r2.r2_Name, r3.r3_Name
option
 (maxdop 1);';

exec sp_executesql @q;

select @id = newid();
insert into @r values (@id, 'group by t.r1_id, t.r2_id, t.r3_id, r1.r1_Name, r2.r2_Name, r3.r3_Name');

select @q = N'/*' + cast(@id as nvarchar(36)) + N'*/' +
N'declare @r1_Name varchar(200), @r2_Name varchar(200), @r3_Name varchar(200), @v int;

select
 @r1_Name = r1.r1_Name, @r2_Name = r2.r2_Name, @r3_Name = r3.r3_Name, @v = sum(v)
from
 dbo.t join
 dbo.r1 on r1.r1_id = t.r1_id join
 dbo.r2 on r2.r2_id = t.r2_id join
 dbo.r3 on r3.r3_id = t.r3_id
group by
 t.r1_id, t.r2_id, t.r3_id, r1.r1_Name, r2.r2_Name, r3.r3_Name
option
 (maxdop 1);';

exec sp_executesql @q;

select @id = newid();
insert into @r values (@id, 'joins outside the group by');

select @q = N'/*' + cast(@id as nvarchar(36)) + N'*/' +
N'declare @r1_Name varchar(200), @r2_Name varchar(200), @r3_Name varchar(200), @v int;

select
 @r1_Name = r1.r1_Name, @r2_Name = r2.r2_Name, @r3_Name = r3.r3_Name, @v = t.v
from
 (select r1_id, r2_id, r3_id, sum(v) as v from dbo.t group by r1_id, r2_id, r3_id) t join
 dbo.r1 on r1.r1_id = t.r1_id join
 dbo.r2 on r2.r2_id = t.r2_id join
 dbo.r3 on r3.r3_id = t.r3_id
option
 (maxdop 1);';

exec sp_executesql @q;

alter table dbo.r1 add unique (r1_Name);
alter table dbo.r2 add unique (r2_Name);
alter table dbo.r3 add unique (r3_Name);

select @id = newid();
insert into @r values (@id, 'group by r1.r1_Name, r2.r2_Name, r3.r3_Name + unique constraints');

select @q = N'/*' + cast(@id as nvarchar(36)) + N'*/' +
N'declare @r1_Name varchar(200), @r2_Name varchar(200), @r3_Name varchar(200), @v int;

select
 @r1_Name = r1.r1_Name, @r2_Name = r2.r2_Name, @r3_Name = r3.r3_Name, @v = sum(v)
from
 dbo.t join
 dbo.r1 on r1.r1_id = t.r1_id join
 dbo.r2 on r2.r2_id = t.r2_id join
 dbo.r3 on r3.r3_id = t.r3_id
group by
 r1.r1_Name, r2.r2_Name, r3.r3_Name
option
 (maxdop 1);';

exec sp_executesql @q;

select
 r.descr, qs.last_elapsed_time, qs.last_logical_reads, qp.query_plan
from
 sys.dm_exec_query_stats qs cross apply
 sys.dm_exec_query_plan(qs.plan_handle) qp cross apply
 sys.dm_exec_sql_text(qs.sql_handle) t join
 @r r on t.Text like '%' + r.m + '%'
order by
 r.row_order;
go

drop table dbo.t, dbo.r1, dbo.r2, dbo.r3;
go


descrlast_elapsed_timelast_logical_readsgroup by r1.r1_Name, r2.r2_Name, r3.r3_Name48577576240group by t.r1_id, t.r2_id, t.r3_id, r1.r1_Name, r2.r2_Name, r3.r3_Name1965432677joins outside the group by1915102677group by r1.r1_Name, r2.r2_Name, r3.r3_Name + unique constraints1958512677
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632264
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmAndy_OLAPпоймите правильно - в официальной документации на OVER есть упоминание, что работает начиная с 2008-й версии.Вам следует знать, что в актуальной документации не упоминаются версии, снятые с поддержки.
Для таких версий есть отдельная документация . В которой легко находится желаемое .Там нет даже SQL 2000 !! Это несерьёзно! ©
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632340
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmСпециально для Andy_OLAP для изучения и осознания

И это всё мне? Ой-вей, я обязательно изучу когда-нибудь Ваш пример. Огромное спасибо за Ваш вклад в дело изучения MSSQL и повышения квалификации участников форума!
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632355
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧингисAndy_OLAP,

скиньте мне литературу
я оказ ограничился только Мартином Грубером
Вам литературу, которую читают SQL разработчики, когда хотят понять, что делать с запросом?
Да пожалуйста , вот классический вариант.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632436
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPИ это всё мне? Ой-вей, я обязательно изучу когда-нибудь Ваш пример. Огромное спасибо за Ваш вклад в дело изучения MSSQL и повышения квалификации участников форума!Дожили до солидного возраста, а ерничаете как дите малое.
Видимо солидный возраст такая же сказка как и все остальное от вас исходящее?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632442
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Да нет, это характер.
У меня есть один родственник, который НИКОГДА, НИ РАЗУ, не говорил, что я был не прав или ошибался и т.д. До него очень долго что либо доходит, когда начинаешь ему что либо обьснять или говорить что он был не прав или как надо было сделать, он начинает уходить совершенно на другую никак не связанную тему, если будешь упорствовать, то начнется агрессия. Потом когда его мозг это переварит, ты оказываешся виноватым, т.к. не так обьснял, быстро говорил и т.д.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632447
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksrovinvm,

Да нет, это характер.
У меня есть один родственник, который НИКОГДА, НИ РАЗУ, не говорил, что я был не прав или ошибался и т.д. До него очень долго что либо доходит, когда начинаешь ему что либо обьснять или говорить что он был не прав или как надо было сделать, он начинает уходить совершенно на другую никак не связанную тему, если будешь упорствовать, то начнется агрессия. Потом когда его мозг это переварит, ты оказываешся виноватым, т.к. не так обьснял, быстро говорил и т.д.
а википедии написано по другому
авторслово, скрывающее под собой некую идеальную форму глупости, нелепости или непонимания человеком своего места.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632452
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Пошел гуглить что это за слово, думал будет что нибудь умное от латыни, а тут оказалось простое, но от этого не менее многосторонее слво :)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39632472
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPИ это всё мне? Ой-вей, я обязательно изучу когда-нибудь Ваш пример. Огромное спасибо за Ваш вклад в дело изучения MSSQL и повышения квалификации участников форума!
господи, ну себя в очередной раз по полной программе посмешищем выставил,
и этого не понимает, черт с ним.
но как не стыдно вместо благодарности
действительно эксперту и настоящему спецу своего дела
высказывать подобное?
абсолютно бесстыжее троллевидное создание,
скажи спасибо invm , который попросил меня попридержать помои,
чтобы не спугнуть главного клоуна,
без которого на форуме станет жутко скучно.
осознай, Гавриленко-то тебя не усмиряет только для того,
чтобы форум травой от скуки не порос
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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