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

Откуда:
Сообщений: 75
дд как оптимизировать запрос?


к примеру

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
15 апр 18, 02:07    [21340304]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
имхо, стоит:
- написать версию сервера?
- привести план запроса

ну и конструкции CONVERT(DATETIME, '2018-02-01 00:00:00', 102) вызывают некое недоумение...
15 апр 18, 03:04    [21340310]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Massa52
Member

Откуда:
Сообщений: 379
Чингис,
Для начала надо бы переписать запрос - для читабельности
гдет - так
;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
15 апр 18, 07:14    [21340377]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
Чингис,

выполнение запроса оптимизируется не только по внешнему виду запроса, но и по составу и количеству данных.
16 апр 18, 14:26    [21342502]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Чингис
Member

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

на счет with-a не знал первый раз вижу спс.
а если проц использовать?
16 апр 18, 19:48    [21343423]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Чингис
Member

Откуда:
Сообщений: 75
Дедушка,

дд скл сервер 2005
16 апр 18, 19:49    [21343425]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Вы бы для начала показали реальный план выполнения (и прикрепили его файлом sqlplan).
Показали статистику логических чтений. Какие индексы и тд. То так на глаз конечно можно, но мало эффективно будет.
17 апр 18, 09:54    [21344421]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
Чингис,

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;
17 апр 18, 10:38    [21344571]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Andy_OLAP
Member

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

"over (partition..." - как бы да, но у автора темы 2005-й, в чем он честно признался.
17 апр 18, 11:46    [21344823]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
Andy_OLAP
как бы да, но у автора темы 2005-й,
Хотите сказать, что в 2005 нет предложения over? Уверены?
17 апр 18, 11:58    [21344857]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
Чингис
Дедушка,

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


дд Чингис, вы часто используете "дд" , это что - "дурдом"?
17 апр 18, 12:25    [21344978]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
invm
Andy_OLAP
как бы да, но у автора темы 2005-й,
Хотите сказать, что в 2005 нет предложения over? Уверены?

Конечно, не уверен.

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

Но если работает на 2005-м - таки замечательно. Вы это лично проверяли?
17 апр 18, 12:27    [21344988]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Andy_OLAP
Member

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

Впрочем, можете не отвечать, вот здесь автор убедился, что на 2005-м работает.
17 апр 18, 12:28    [21344998]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1364
Andy_OLAP
invm
пропущено...
Хотите сказать, что в 2005 нет предложения over? Уверены?

Конечно, не уверен.

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

Но если работает на 2005-м - таки замечательно. Вы это лично проверяли?

официальная документация
17 апр 18, 12:51    [21345085]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Andy_OLAP
Member

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

Вы свою ссылку не открывали? Там прямо в верхей части страницы обычным шрифтом - "Это содержимое было выведено из использования и, возможно, не будет обновляться в будущем. Продукт, служба или технология, упомянутые в этом содержимом, больше не поддерживаются".
17 апр 18, 17:20    [21346214]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Andy_OLAP
felix_ff,

Вы свою ссылку не открывали? Там прямо в верхей части страницы обычным шрифтом - "Это содержимое было выведено из использования и, возможно, не будет обновляться в будущем. Продукт, служба или технология, упомянутые в этом содержимом, больше не поддерживаются".
Прикольно. Наверно, это относится к версии сервера (SQL2005)
17 апр 18, 17:30    [21346253]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
felix_ff
Member

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

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

для 2012 инстанса наверное в документацию к 2017 полезете? ну удачи.
17 апр 18, 17:56    [21346319]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Andy_OLAP
Member

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

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

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

Я тоже когда думаю о Вас - думаю о Вас плохо, но по другой причине, не связанной с документацией на MSSQL...
17 апр 18, 19:27    [21346559]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
Andy_OLAP
поймите правильно - в официальной документации на OVER есть упоминание, что работает начиная с 2008-й версии.
Вам следует знать, что в актуальной документации не упоминаются версии, снятые с поддержки.
Для таких версий есть отдельная документация. В которой легко находится желаемое.
17 апр 18, 20:24    [21346681]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
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, а потом уже присоединять справочники.
17 апр 18, 20:32    [21346693]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Andy_OLAP
Member

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

Или Вы хотите научить молодого разработчика сложностям, а потом взять с него немного шекелей за платную консультацию, когда тормозить будет неожиданно сильнее, а он уже без наркомовских 100 грамм не поймет, что и как?
17 апр 18, 20:34    [21346698]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Чингис
Member

Откуда:
Сообщений: 75
Ролг Хупин,

это добрый день
17 апр 18, 21:34    [21346830]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Чингис
Member

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

скиньте мне литературу
я оказ ограничился только Мартином Грубером
17 апр 18, 21:35    [21346838]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Чингис
Member

Откуда:
Сообщений: 75
invm
Чингис,

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 ')'.
17 апр 18, 21:46    [21346864]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Чингис
Member

Откуда:
Сообщений: 75
и как у вас все просто
у вас генератор оптимизатор или построитель скл установлен?
17 апр 18, 21:48    [21346870]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить