Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

План запроса с IN   Найти похожие ветки 

 
kaif ©   (2004-04-29 00:46) [0]

Допустим, яделаю простой запрос:
SELECT * FROM T WHERE ID = 15
получаю такой план:
PLAN (GOODS INDEX (RDB$PRIMARY101))
Я так понимаю, что это использование индекса RDB$PRIMARY101
-----------------------
Теперь я делаю такой запрос
SELECT * FROM T WHERE ID IN (15,16)
получаю такой план:
PLAN (GOODS INDEX (RDB$PRIMARY101,RDB$PRIMARY101))
------------------------
Наконец, я делаю так:
SELECT * FROM T WHERE ID IN (15,16,17,18,19)
и получаю такой план:
PLAN (GOODS INDEX (RDB$PRIMARY101,RDB$PRIMARY101,RDB$PRIMARY101,RDB$PRIMARY101,RDB$PRIMARY101))
------------------------
Можно заметить, что один и тот же индекс перечисляется столько раз, сколько имеется элементов в явно указанном множестве.

У меня вопрос к знатокам синтаксиса PLAN.
Что означает эта конструкция с перечислением 5 раз одного и того же индекса?


 
Vemer ©   (2004-04-29 01:12) [1]

Не крутой знаток, но могу предположить, что IN согласно своей сущности перебирает все множество. Поэтому запросов с IN следует стараться избегать под IB. Например с помощью Exist или Left Join с проверкой на Null.


 
Petr.V Abramov   (2004-04-29 02:52) [2]

IN преобразуется в OR.
P.S. скажите спасибо, что не в UNION :)


 
kaif ©   (2004-04-29 16:16) [3]

2 Petr.V Abramov   (29.04.04 02:52) [2]
 IN преобразуется в OR.
 Спасибо. Я попробовал переделать в OR - действительно, план тот же. То есть перечисление индексов, судя по всему, соответствует последовательности проверок всех условий.
 Или я не прав?
 К сожалению, информация по планам на ibase.ru настолько скудная... Кроме одного документа за 1993 г. практически ничего содержательного там я не нашел. Может кто знает еще какие-то источники? Я экспериментирую с вложенными запросами и мне хотелось бы очень точно понимать синтакис планов.


 
Johnmen ©   (2004-04-29 17:03) [4]

>kaif ©   (29.04.04 16:16) [3]

На http://www.krista.ru/ib/ ходил ?


 
Petr V. Abramov ©   (2004-04-29 17:10) [5]

> Или я не прав?
 Прав. А как, по-Вашему, еще можно реализовать IN ? Другой вопрос, что IN ( select X from <откуда-то>) должен преобразовываться в join, что, по слухам, делается не всегда. Хотя за FB 1.5 я такого не замечал.


 
kaif ©   (2004-04-29 17:11) [6]

Я там только "Плановое хозяйство" смотрел. Сейчас вижу, что там еще какая-то информация есть. Спасибо.


 
kaif ©   (2004-04-29 17:13) [7]

2 Johnmen ©   (29.04.04 17:03) [4]
 Да, это именно тот материал, который мне как-то уже попадался и я все не мог его найти. Спасибо! Там о подзапросах много написано.


 
Johnmen ©   (2004-04-29 17:28) [8]

>Petr V. Abramov ©   (29.04.04 17:10) [5]
>А как, по-Вашему, еще можно реализовать IN ?

Смотря какой IN.


 
Petr V. Abramov ©   (2004-04-29 17:52) [9]

> Johnmen ©   (29.04.04 17:28) [8]
> Смотря какой IN.
 Ну какой? :)


 
Johnmen ©   (2004-04-29 18:08) [10]

>Petr V. Abramov ©   (29.04.04 17:52) [9]

Есть же 2 реализации IN.
1. (x1,x2,...xn)
2. (SELECT x FROM ...)
Второй можно реализовать и по-другому.


 
Petr V. Abramov ©   (2004-04-29 18:13) [11]

> Johnmen ©   (29.04.04 18:08) [10]
 Второй - нужно по-другому. Я и не спорю, см. [5]


 
Johnmen ©   (2004-04-29 18:20) [12]

>Petr V. Abramov ©
>должен преобразовываться в join,

Вот это я не понял ([5])... И это породило [8]&[10]


 
kaif ©   (2004-04-29 18:35) [13]

Почему бы не интерпретировать вхождение в множество, как INNER JOIN ? Можно же рассматривать множество так же, как результат выборки SELECT x FROM ... Упорядочить (SORT) и объединить с помощью какого-нибудь MERGE. Зачем реализовывать это как перечисление отдельных условий с OR? Странно как-то это все... А что, разве объединение с SELECT x FROM ... не то же самое в конечном итоге? Тоже ведь можно представить в виде огромного кол-ва условий OR. Но так не делают.


 
Petr V. Abramov ©   (2004-04-29 18:41) [14]

А во что же оно должно преобразовываться? Разве
 select *
 from T1 where Y in ( select X from T2)

 не то же самое, что

 select T1.*
 from T1, T2
 where T1.Y = T2.X

Другой случай, когда подзапрос сильно навороченный и никак не связан с T1. Но тут уже грань между join и перебором стирается. Кстати, есть ссылки на алгоритмы join в FB?


 
Petr V. Abramov ©   (2004-04-29 18:44) [15]

> Кстати, есть ссылки на алгоритмы join в FB?
 Есть :)


 
Petr V. Abramov ©   (2004-04-29 18:47) [16]

> Johnmen ©   (29.04.04 18:20) [12]
 Наверно, под JOIN Вы поняли вполне конкретный алгоритм соединения таблиц, а я имел в виду операцию соединения как таковую


 
kaif ©   (2004-04-29 19:55) [17]

Я и говорю. Если

select *
from T1 where Y in ( select X from T2)

то же самое, что

select T1.*
from T1, T2
where T1.Y = T2.X

то и

select *
from T1 where Y in (1,2,3)

то же самое, что и

select T1.*
from T1, T2
where T1.Y = T2.X

где T2 - виртуальная таблица вида:

X
===
1
2
3

 Просто нужно упорядочить это множество и все обычные алгоритмы объединений (какие бы они не были - не важно), работающие для объединения двух простых таблиц будут работать точно так же.


 
Petr V. Abramov ©   (2004-04-29 20:58) [18]

> kaif ©   (29.04.04 19:55) [17]
 А зачем лишний раз чего-то упорядочивать? Это недешево.
 "обычные алгоритмы объединений" ни на каком волшебстве не основаны. Та же операция JOIN - обычное лазание по индексам, с пердварительной прикидкой, у какой таблицы cardinality с учетом условий отбора - меньше. Четкого описания этого алгоритма (nested loops) конкретно для IB я не видел, но видел для Oracle, и у меня есть подозрение, что его основе лет 50 и он используется всеми СУБД. Ибо простой :) О том, что IB использует его же, косвенно сужу по порядку записей, возвращаемых запросами.


 
Johnmen ©   (2004-04-30 09:57) [19]

>Petr V. Abramov ©   (29.04.04 18:41) [14]
>А во что же оно должно преобразовываться? Разве
> select *
> from T1 where Y in ( select X from T2)

> не то же самое, что

> select T1.*
> from T1, T2
> where T1.Y = T2.X

Конечно же это не одно и то же !!!


 
kaif ©   (2004-04-30 12:45) [20]

2 Johnmen ©   (30.04.04 09:57) [19]
Конечно же это не одно и то же !!!

А по-моему одно и то же, если абстрагироваться от списка возвращаемых колонок и сконцентрировать свое внимание на списке возвращаемых из первой таблицы строк. Во всяком случае интуитивно понятно, что имелось в виду под "одно и то же". Одни и те же записи из первой таблицы.


 
Johnmen ©   (2004-04-30 13:01) [21]

>kaif ©   (30.04.04 12:45) [20]

Если ... То да.
:)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.033 c
1-1083061938
27-27-41
2004-04-27 14:32
2004.05.23
Перевод string в char


9-1073226179
Zak3D[@Tm]
2004-01-04 17:22
2004.05.23
Создание игры.


4-1081525205
Raevsky
2004-04-09 19:40
2004.05.23
Процессы в Win2K,WinXP


7-1081964341
NEKTO
2004-04-14 21:39
2004.05.23
Процессы, потоки


14-1083535516
Феликс
2004-05-03 02:05
2004.05.23
В сети завелся новый червь





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский