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

Откуда: Київ
Сообщений: 10428
Есть такой запрос, что здесь можно оптимизировать?
Проверка типов смущает, может можно как-то "умнее" переписать?

SELECT 
n3.id, n.name, n.object_type, n.parent_id, n.create_date, n.creator_id,
n1.modify_date, n1.modify_id
FROM dbo.t_x3 n3
inner join dbo.t_x0 n on n.id=n3.id 
    and n3.deleted=0
	and	n3.object_type not between 11 and 12
	and n3.object_type<>23
	and	n3.object_type not between 45 and 65
	and n3.object_type not between 73 and 99
	and n3.object_type<>78
	and n3.object_type not between 170 and 167
	and n3.object_type not between 552 and 3112
	and n3.object_type <7000
inner join dbo.t_ex1 n1 on n1.id=n3.id
17 июн 13, 14:31    [14442325]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
Проверка типов смущает,

Еще бы
and n3.object_type not between 73 and 99
and n3.object_type<>78
17 июн 13, 14:33    [14442338]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
Glory
Member

Откуда:
Сообщений: 104751
И ваши <> и not between - это куча OR-ов
17 июн 13, 14:34    [14442348]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
может, завести табличку допустимых типов и join к ней?
17 июн 13, 14:37    [14442365]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
Konst_One
Member

Откуда:
Сообщений: 11620
через один большой case
17 июн 13, 14:38    [14442372]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Winnipuh,

А что именно нужно оптимизировать? Код, чтобы не писать столько условий или быстродействие?
Если второе, то выкладывайте действительный план и какие-то характеристики, как оно сейчас выполняется, время/чтения/cpu.
17 июн 13, 14:50    [14442440]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
Проверка типов смущает,

Еще бы
and n3.object_type not between 73 and 99
and n3.object_type<>78


это не существенно
17 июн 13, 15:02    [14442537]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
samoxod
Member

Откуда: Москва
Сообщений: 31
Winnipuh,
Вот эта строка точно правильная?
and n3.object_type not between 170 and 167
17 июн 13, 15:03    [14442546]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Winnipuh
	and	n3.object_type not between 11 and 12
	and n3.object_type<>23
	and	n3.object_type not between 45 and 65
	and n3.object_type not between 73 and 99
	and n3.object_type<>78
	and n3.object_type not between 170 and 167
	and n3.object_type not between 552 and 3112
	and n3.object_type <7000
inner join dbo.t_ex1 n1 on n1.id=n3.id

У меня лично возникла ассоциация со сказкой про золотую рыбку. "Ничего не ответила рыбка."
Поддерживаю 14442365
17 июн 13, 15:08    [14442588]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
Glory
пропущено...

Еще бы
and n3.object_type not between 73 and 99
and n3.object_type<>78


это не существенно

Раз несущественно, то уберите вообще все проверки n3.object_type
17 июн 13, 15:12    [14442621]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34697
Winnipuh,

Собери в одном выражении все условия на каждое поле.
Чтобы было по одному условию на поле.
Это никак не поможет ускорению запроса, это поможет всем (и тебе в том числе) его лучше понять.

А так -- да, особенно нечего оптимизировать, поскольку из SARG-ов только

and n3.deleted=0

не думаю, что с таким условием записей мало.

Ну и надеюсь, что на условия JOIN-ов индексы есть у тебя, если нет -- добавляй, вот так и оптимизируешь.
17 июн 13, 16:08    [14443124]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
WITH ExceptTypes AS(SELECT * FROM(VALUES(11,12),(23,23),(45,65),(73,99),(167,170),(552,3112))T(FromType,ToType))
SELECT n3.id,n.name,n.object_type,n.parent_id,n.create_date,n.creator_id,n1.modify_date,n1.modify_id
FROM dbo.t_x3 n3
JOIN dbo.t_x0 n ON n.id=n3.id 
 AND n3.deleted=0
 AND n3.object_type <7000
 AND NOT EXISTS(SELECT * FROM ExceptTypes ET WHERE n3.object_type BETWEEN ET.FromType AND ET.ToType)
JOIN dbo.t_ex1 n1 ON n1.id=n3.id;
17 июн 13, 16:25    [14443273]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Cygapb-007
может, завести табличку допустимых типов и join к ней?

самая эффективная оптимизация будеи и по удобству понимания и по быстродействию. Заполнить табличку идентификаторами типов <7000 , потом удалить из нее
and	n3.object_type not between 11 and 12
	and n3.object_type<>23
	and	n3.object_type not between 45 and 65
	and n3.object_type not between 73 and 99
	and n3.object_type<>78
	and n3.object_type not between 170 and 167
	and n3.object_type not between 552 and 3112

а потом уже джойнить с ней
17 июн 13, 17:55    [14444039]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31912
Cygapb-007
может, завести табличку допустимых типов и join к ней?
+1

Если есть справочник object_type, и количество допустимых object_type после всех этих условий небольшое, а dbo.t_x3 большая, то выгодно в процедуре заполнить таблицу-переменную с допустимыми object_type, и потом сджойнить.
Естественно, нужен индекс dbo.t_x3(deleted, object_type), или фильтрованный dbo.t_x3(object_type) where deleted = 0

Ещё нужно понять, что за таблицы dbo.t_x0 и dbo.t_ex1 - они ограничивают выборку или нет? Может, и условия по object_type окажутся неважны?

Ещё вариант - кроме object_type сделать ещё какой то статус для показа, который поддерживать при обновлении object_type, возможно в триггере.
17 июн 13, 19:37    [14444423]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
Mikebond
Member

Откуда: Киев
Сообщений: 32
Мистер Хенки,
автор
самая эффективная оптимизация...

Как вариант : добавить в dbo.t_x3 какое-то поле-флаг "соответствует_такому-то_критерию" (1 / 0) и всем нужным object_type'ам поставить там "1", остальным - 0. По возможности, этот флаг выставлять с клиента при создании нового типа (или добавить какой-то "танец с бубном" в момент создания нового типа на сервере) . При отсутствии возможности изменения клиента, мне кажется лучше будет сначала один раз проапдейтить это поле по такому заковыристому шаблону("not between .... not in..." и т.д.), а потом селекты делать просто по признаку "Where <флаг> = 1".
Если справочник типов изменяется редко, то вполне рабочий вариант.
17 июн 13, 20:09    [14444490]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать такой запрос?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Столько предложений, а автор до сих пор не сказал, что оптимизируем.

Если вслепую, то лично я, голосую за вариант iap. Только нужно бы, посмотреть на планы. Может быть, то что предложил iap имеет смысл выделить во временную таблицу, статистики для. А может и так оценки не сильно будут отличаться - зависит от данных.

А может внимание приковано не туда? Настораживает фраза "это не существенно"
В связи с этим, лучший вариант Glory: "Раз несущественно, то уберите вообще все проверки n3.object_type"!
17 июн 13, 22:00    [14444701]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить