Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Добрый день!
Подскажите плиз, оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица), в случае, если в таблице довольно много записей?
Т.е. можно ли сказать, что запрос вида:
select id
from MyTable m
inner join TempTable t
where m.id = t.id

будет существенно быстрее чем

select id
from MyTable
where id in (select id from TempTable)

при условии, что в TempTable отобралось количество записей, близкое от десятой части до половины и более записей от MyTable?
16 фев 12, 11:01    [12101115]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Подскажите плиз, оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица), в случае, если в таблице довольно много записей?

Все запросы оптимизируются.
Просто вы наверное в слово "оптимизируется" вкладываете смысл "самый лучший".
А это неправильно.
16 фев 12, 11:04    [12101130]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Т.е. можно ли сказать, что запрос вида:
select id
from MyTable m
inner join TempTable t
where m.id = t.id

будет существенно быстрее чем

select id
from MyTable
where id in (select id from TempTable)

Для начала - эти запросы могут вернуть разные результаты
16 фев 12, 11:05    [12101141]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Я вкладываю в смысл "оптимизируется" то, что, к примеру, in (1, 2, 3) может оптимизатором в некоторых СУБД раскладываться по факту в where id = 1 or id = 2 ot id = 3. Может такой как я написала запрос с in, по факту скулем раскладывается в запрос с join, если это выгоднее?
16 фев 12, 11:05    [12101151]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Glory
Для начала - эти запросы могут вернуть разные результаты

Обработка null значений в списке, это имеете в виду? Предположим, что таких нет.
16 фев 12, 11:07    [12101167]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Я вкладываю в смысл "оптимизируется" то, что, к примеру, in (1, 2, 3) может оптимизатором в некоторых СУБД раскладываться по факту в where id = 1 or id = 2 ot id = 3.

На стадии создания плана выполнения оптмизатру неизвестны никакие значение из таблиц и переменных
Поэтому вместо where id in (select id from TempTable) он не может поставить никаких "where id = 1 or id = 2 ot id = 3"
16 фев 12, 11:08    [12101174]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Kateryne
Glory
Для начала - эти запросы могут вернуть разные результаты

Обработка null значений в списке, это имеете в виду? Предположим, что таких нет.
Нет, имеется в виду повторы значений.
16 фев 12, 11:08    [12101180]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Обработка null значений в списке, это имеете в виду? Предположим, что таких нет.

А сервер как узнает о вашем "предположим" ?
16 фев 12, 11:09    [12101188]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
tpg
Kateryne
пропущено...

Обработка null значений в списке, это имеете в виду? Предположим, что таких нет.
Нет, имеется в виду повторы значений.

А, ну я же поэтому и назвала поле - id. На каждом из них - ключ уникальности, повторов быть не может, СУБД в принципе об этом может знать, по идее?
16 фев 12, 11:10    [12101196]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Glory
Kateryne
Обработка null значений в списке, это имеете в виду? Предположим, что таких нет.

А сервер как узнает о вашем "предположим" ?

Если стоит соединение по первичному не-нуллабельному уникальному ключу?
16 фев 12, 11:11    [12101203]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Ну а вообще, как по вашему мнению, какой из запросов будет быстрее и, главное, насколько?
16 фев 12, 11:13    [12101234]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Если стоит соединение по первичному не-нуллабельному уникальному ключу?

Тогда сервер будет выбирать тип соединения.
И он может оказаться одинаковым для обеих запросов.
16 фев 12, 11:13    [12101236]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
iljy
Member

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

давно бы проверили уже, делов-то.
16 фев 12, 11:13    [12101241]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Ну а вообще, как по вашему мнению, какой из запросов будет быстрее и, главное, насколько?

А кто сильнее - слон или кит ?
Что вам мешает сравнить запросы и получить конкретные цифры ?
Или вы думаете, что какой то запрос _всегда_ должен выигрывать ?
16 фев 12, 11:14    [12101258]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Glory
Kateryne
Если стоит соединение по первичному не-нуллабельному уникальному ключу?

Тогда сервер будет выбирать тип соединения.
И он может оказаться одинаковым для обеих запросов.


О, вот это было бы прекрасно! :)

iljy
Kateryne,

давно бы проверили уже, делов-то.

Дольше, честно говоря :) Пока записи нагенерируешь
16 фев 12, 11:17    [12101287]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Glory
Kateryne
Ну а вообще, как по вашему мнению, какой из запросов будет быстрее и, главное, насколько?

А кто сильнее - слон или кит ?
Что вам мешает сравнить запросы и получить конкретные цифры ?
Или вы думаете, что какой то запрос _всегда_ должен выигрывать ?

Ну я же граничные условия дала, по идее это можно чисто теоретически вычислить. А практически проверять честно говоря - это не на один час задача, так как скуль не основная СУБД, а разработка ведется под ORM, и скуля просто не стоит.
Вопрос ставится исходя из того, что проще, если запрос с in. И хотелось узнать мнение специалистов именно по скулю, насколько это критично, если при отборах всегда будет in, а не inner join, даже если в in-списке очень много записей.
16 фев 12, 11:20    [12101331]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Kateryne
iljy
Kateryne,

давно бы проверили уже, делов-то.

Дольше, честно говоря :) Пока записи нагенерируешь


Я вас умоляю
use tempdb
create table t1(id int primary key, val int)

insert t1
select number, ABS(CHECKSUM(NEWID()))
from master..spt_values
where type = 'P'

create table t2 (id int primary key)
insert t2
select number * 2
from master..spt_values
where type = 'P'


go
select t1.* from t1
where id in (select id from t2)
go
select t1.* from
t1 join t2 on t1.id = t2.id
go
drop table t1
drop table t2
16 фев 12, 11:22    [12101366]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
iljy,
Дольше, потому что я плохо знаю T-SQL, это раз :)
И у нас в борьбе за лицензионную чистоту снесли все СУБД, кроме бесплатного PosgreSQL )
16 фев 12, 11:25    [12101400]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Ну я же граничные условия дала, по идее это можно чисто теоретически вычислить

Вы дали имена таблиц и тип соединения.
Все, что может сервер - это определить наличие индексов, количество записей и статистику распределения значений.
И на основе этой информации построить план.


Kateryne
А практически проверять честно говоря - это не на один час задача

Вы несколько часов будете сравнивать два плана выполнения ?


Kateryne
Вопрос ставится исходя из того, что проще, если запрос с in.

Проще кому ?

Kateryne
И хотелось узнать мнение специалистов именно по скулю, насколько это критично, если при отборах всегда будет in, а не inner join, даже если в in-списке очень много записей.

Еще раз - планы выполнения могут оказаться _идентичными_
Нет конструкции, которая всегда обязательно быстрее другой конструкции
16 фев 12, 11:28    [12101447]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Glory
Kateryne
Ну я же граничные условия дала, по идее это можно чисто теоретически вычислить

Вы дали имена таблиц и тип соединения.
Все, что может сервер - это определить наличие индексов, количество записей и статистику распределения значений.
И на основе этой информации построить план.

Ну, еще я сказала, что поля - первичные ключи с уникальным индексом, и в обоих таблицах сопоставимое количество записей.

Glory
Kateryne
А практически проверять честно говоря - это не на один час задача

Вы несколько часов будете сравнивать два плана выполнения ?

У нас снесли буквально на днях наши тестовые СУБД :( Сижу третий день без скуля и без оракла, только с postresql, так что если тестить - то развертывать скуль, тестировать, потом удалять :( Надеюсь, этот маразм через недельку закончится.

Glory
Kateryne
Вопрос ставится исходя из того, что проще, если запрос с in.

Проще кому ?

Проще нам, потому что ограничения некой системы, в которую мы не можем вмешиваться (чужая разработка), которая не позволяет просто взять и сделать inner join, а только in. Но возможно, что если извратиться, то таки получится и inner join. Вот и непонятно, имеет ли смысл извращаться, или и так ничего страшного.

Glory
Kateryne
И хотелось узнать мнение специалистов именно по скулю, насколько это критично, если при отборах всегда будет in, а не inner join, даже если в in-списке очень много записей.

Еще раз - планы выполнения могут оказаться _идентичными_
Нет конструкции, которая всегда обязательно быстрее другой конструкции

Так вот это я как раз по Oracle знаю, и на это и была надежда. Я очень хочу, как раз, чтобы они были идентичными :)
16 фев 12, 11:37    [12101558]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Ну, еще я сказала, что поля - первичные ключи с уникальным индексом, и в обоих таблицах сопоставимое количество записей.

Что вы тогда называли "Ну я же граничные условия дала,"
16 фев 12, 11:39    [12101582]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Kateryne
И у нас в борьбе за лицензионную чистоту снесли все СУБД, кроме бесплатного PosgreSQL )

поставьте express, он тоже бесплатный
отлаживать запросы на форуме не очень эффективно
16 фев 12, 11:41    [12101608]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Shakill
Kateryne
И у нас в борьбе за лицензионную чистоту снесли все СУБД, кроме бесплатного PosgreSQL )

поставьте express, он тоже бесплатный
отлаживать запросы на форуме не очень эффективно

Угу, написали заявку на установку, они:
"рассматривают на предмет легальности установки"! чтоб им.
16 фев 12, 11:45    [12101642]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Shakill
поставьте express, он тоже бесплатный


а в р2 до 10 гиг базы держит
или за весьма скромную цену купить dev
16 фев 12, 11:50    [12101704]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизирует ли MS SQL отбор вида "where field in (select id from ВременнаяТаблица)?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3757
Kateryne,
фишка в том что статистики по темп таблицам у склсервера нет. Так что если у вас темп таблицы - реально темп, план лучше захинтовать
16 фев 12, 20:03    [12105834]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить