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

В одной забавной фирме на собеседовании проходил тесты по Delphi и SQL. Особенно меня задел последний вопрос в тесте по SQL (остальные, кстати, были толковые).

Вот он:
"Есть запрос:
select T1.F1 from T1 left outer join T2 on T1.F2 = T2.F2 or T1.F3 = T2.F3
Как оптимизировать запрос? И чем этот запрос плох?"

Я ответил, что запрос оптимизировать не нужно - нужно перепроектировать БД. Имея в виду, что связь через два независимых ключевых поля - признак того, что T1 не нормализована. Что - по моим понятиям - не есть гуд.

Прав ли я? Или ответ должен быть другим?

P.S. Хотя в фирме используют MS SQL, в самом тесте движок не уточнялся.
30 июл 09, 16:24    [7480272]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
Glory
Member

Откуда:
Сообщений: 104760
OR оптимизируется через UNION или повторный JOIN
Если вопрос был именно про оптимизацию а не про проектирование
30 июл 09, 16:28    [7480289]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Как оптимизировать запрос? И чем этот запрос плох?"


Вызывает недоумение наличии объединения, причем внешнего левого, с таблицей Т2, при том, что выводятся данные только из T1. То что все записи будут выведены из T1 - можно сделать и без объединения. При условии связи 1-ко многим, ничего, кроме дублей в выборке не получим. Он не плох и не хорош. На мой взгляд он бессмысленен. Говорить об оптимизации бессмысленного запроса даже не хочется.
30 июл 09, 16:30    [7480306]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
оптимизец
Guest
select T1.F1 from T1 left outer join T2 on T1.F2 = T2.F2 or T1.F3 = T2.F3
тождественно
select T1.F1 from T1 
30 июл 09, 16:32    [7480327]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
pkarklin
автор
Как оптимизировать запрос? И чем этот запрос плох?"


Вызывает недоумение наличии объединения, причем внешнего левого, с таблицей Т2, при том, что выводятся данные только из T1. То что все записи будут выведены из T1 - можно сделать и без объединения. При условии связи 1-ко многим, ничего, кроме дублей в выборке не получим. Он не плох и не хорош. На мой взгляд он бессмысленен. Говорить об оптимизации бессмысленного запроса даже не хочется.
Это верно только в случае, если связь по уникальному ключу производится. Если же в T2 связка F2 и F3 не уникальна, то результат разный будет.

З.Ы. Но вообще, бестолковый вопрос, имхо.
30 июл 09, 16:33    [7480331]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
NektoNikto
Guest
Glory,

Вопрос был именно про оптимизацию.
30 июл 09, 16:33    [7480335]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
Glory
Member

Откуда:
Сообщений: 104760
оптимизец
select T1.F1 from T1 left outer join T2 on T1.F2 = T2.F2 or T1.F3 = T2.F3
тождественно
select T1.F1 from T1 

Нет, если связь 1-М
30 июл 09, 16:34    [7480339]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Гавриленко Сергей Алексеевич
Это верно только в случае, если связь по уникальному ключу производится.


Именно поэтому я и оговорил случай 1-к-М. ;)
30 июл 09, 16:35    [7480353]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
оптимизец
select T1.F1 from T1 left outer join T2 on T1.F2 = T2.F2 or T1.F3 = T2.F3
тождественно
select T1.F1 from T1 

Садись, 2. Учим матчасть:

if object_id('tempdb..#t1') is not null
    drop table #t1
create table #t1( id int )
if object_id('tempdb..#t2') is not null
    drop table #t2
create table #t2( id int )

insert #t1 select 1
insert #t2 select 1 union all select 1

select id from #t1
select t1.id from #t1 t1 left join #t2 t2 on t1.id = t2.id
30 июл 09, 16:36    [7480361]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
pkarklin
Гавриленко Сергей Алексеевич
Это верно только в случае, если связь по уникальному ключу производится.


Именно поэтому я и оговорил случай 1-к-М. ;)
Ага, не дочитал.
30 июл 09, 16:37    [7480374]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
Glory
Member

Откуда:
Сообщений: 104760
NektoNikto
Glory,

Вопрос был именно про оптимизацию.

По-моему, это вопрос про то, знаете ли вы, к чему приводят фильтры OR и как их оптимизируют.
Структура базы и результат запроса тут вторичны
30 июл 09, 16:38    [7480379]     Ответить | Цитировать Сообщить модератору
 Re: Чем плох приведённый запрос?  [new]
NektoNikto
Guest
Glory,

Спасибо! Сдаётся мне, что Вы правы.
30 июл 09, 16:46    [7480446]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить