Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизировать case / 16 сообщений из 16, страница 1 из 1
18.03.2021, 14:42
    #40054940
georgy_2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
Добрый день!
Просьба помочь с оптимизированием куска запроса

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select	1
		
			   from   (select		lot , sum(case status when 'HOLD' then qty else 0 end) as sum_qtyonhold_lli
					   from		table1
					   group by	lot) lli
					RIGHT OUTER JOIN
					table2  l on lli.lot = l.lot
			   where		isnull(lli.sum_qtyonhold_lli, 0) <> l.qtyonhold 



Как можно его переписать, что бы было меньше логического чтения?

Table 'table1'. Scan count 5, logical reads 7679
Table 'table2'. Scan count 5, logical reads 4854,


Заранее спасибо!
...
Рейтинг: 0 / 0
18.03.2021, 14:44
    #40054944
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
Все агрегатные функции за исключением COUNT(*) игнорируют значения NULL.
...
Рейтинг: 0 / 0
18.03.2021, 14:50
    #40054947
georgy_2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
Konst_One,

Примерно понял, может есть еще какие варианты как сделать лучше?

Спасибо!
...
Рейтинг: 0 / 0
18.03.2021, 14:51
    #40054948
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
актуальный план покажите
...
Рейтинг: 0 / 0
18.03.2021, 14:54
    #40054950
georgy_2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
Konst_One,
...
Рейтинг: 0 / 0
18.03.2021, 15:01
    #40054956
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
посмотрите на индексы для начала
...
Рейтинг: 0 / 0
18.03.2021, 15:03
    #40054958
georgy_2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
Konst_One,

На что именно должен посмотреть? Clustered index scan?
...
Рейтинг: 0 / 0
18.03.2021, 15:05
    #40054959
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
georgy_2012,

Код: sql
1.
isnull(lli.sum_qtyonhold_lli, 0) <> l.qtyonhold 



это для чего? NULL никогда ничему не равен, это избыточное преобразование.

Код: sql
1.
2.
where lli.sum_qtyonhold_lli <> l.qtyonhold 
  and l.qtyonhold <> 0
...
Рейтинг: 0 / 0
18.03.2021, 15:08
    #40054962
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
Индекс lot include (qtyonhold).
...
Рейтинг: 0 / 0
18.03.2021, 15:13
    #40054964
georgy_2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
Владислав Колосов,

Большое спасибо за ответы!

А есть какой-нибудь сайт/книга/что угодно где можно было бы почитать про оптимизацию запросов по типу вот такого? Понимаю, что надо руку набивать, но набивать тоже надо на чем-то.
...
Рейтинг: 0 / 0
18.03.2021, 15:26
    #40054972
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
много можно что почитать на эту тему. вот это посмотрите, например:
https://www.sqlshack.com/sql-server-query-execution-plan-beginners-types-options/
https://www.sqlshack.com/how-to-read-an-execution-plan-with-all-details/
...
Рейтинг: 0 / 0
18.03.2021, 15:50
    #40054987
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
georgy_2012,

1. Оптимизировать в запросе нечего, хоть и написан он криво. Ибо будет полное сканирование таблицы/индекса и table1, и table2. Ускорить можно создав для table1 индексированное представление или columnstore index

2. Заменять isnull(lli.sum_qtyonhold_lli, 0) <> l.qtyonhold на lli.sum_qtyonhold_lli <> l.qtyonhold нельзя - условия не эквивалентны.
...
Рейтинг: 0 / 0
18.03.2021, 15:55
    #40054988
georgy_2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
invm,

А как можно его тогда переписать, что бы не был таким кривым?
...
Рейтинг: 0 / 0
18.03.2021, 16:25
    #40054998
georgy_2012
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
Konst_One,

Спасибо за сслыки!
...
Рейтинг: 0 / 0
18.03.2021, 16:40
    #40055002
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
georgy_2012
А как можно его тогда переписать, что бы не был таким кривым?
Не совсем понятно, что вы хотите получить.
Возможно вот такое
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select
 1
from
 (
  select lot, qtyonhold from table2

  except

  select
   lot, sum(case status when 'HOLD' then qty else 0 end)
  from
   table1
  group by
   lot
 ) a
...
Рейтинг: 0 / 0
18.03.2021, 19:17
    #40055030
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать case
На таком объёме данных ускорять, в общем-то, нечего.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизировать case / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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