Re[6]: SQL запрос к ODBC
От: Lexey Россия  
Дата: 14.12.01 09:10
Оценка:
Здравствуйте VVV, Вы писали:

VVV>Здравствуйте Lexey, Вы писали:


L>>Здравствуйте VVV, Вы писали:


VVV>>>Здравствуйте Lexey, Вы писали:


L>>>>Здравствуйте VVV, Вы писали:


VVV>>>>>1) может быть такая штука ускорит запрос

VVV>>>>>... WHERE 0=(SELECT COUNT(*) FROM T1 WHERE (T2.Ф=T1.Ф) AND (T2.И=T1.И) AND (T2.О=T1.О))

L>>>>Едва-ли, скорее наоборот замедлит (если оптимизатор не разберется).


VVV>>>ну уж не замедлит — это точно.


L>>Аргументы в студию?

L>>Обратные аргументы: IN (SELECT ...) — SELECT выполняется всего один раз, потом просто идет сравнение хешей. Здесь же на каждую строку из T2 идет подзапрос по T1, что однозначно медленнее. Впрочем, это голое теоретизирование. Умный оптимизатор скорее всего сведет все к одному и тому же плану.

VVV>Ну теория, так теория

VVV>Отчего же в IN (SELECT ...) SELECT выполняется один раз??? Ведь для каждой Ф(И,О) из Т2 мы должны это сделать (к

А от чего ему больше выполняться? Он же не привязан к конкретному значению из T1. Там 3 таких селекта, ну выполнятся они по разу. И все.

>тому же там всё соединяется по OR, что плохо оптимизируется, а у меня по AND, что оптимизируется замечательно, ибо

>каждый следующий подзапрос будет происходить уже по подвыборке). Или не так? К тому же, опыт показывает, что запрос

По какой подвыбоке? У тебя из полного набора записей будет искаться строка с заданными значениями полей. По индексу это очень быстро, но все равно, на каждую запись в T1 — один поиск по идексу. Сомневаюсь, что это быстрее, чем один раз загрузить три выборки в память и пройтись по ним.

>SELECT COUNT(*) выполняется быстрее, чем аналогичный без COUNT — видимо таковы внутренности драйвера (хотя это я >проверял много лет назад, но впечатление осталось )


Это где он быстрее выполняется?

VVV>Теория без практики — не теория Предлагаю VVS опубликовать результаты, что, несомненно, будет очень полезно.


А вообще, зря мы спорим, т.к. исходный запрос-то был попросту неправилный (я на это даже и внимания сначала не обратил . Там OR-логика вообще не прокатывает. И в любом случае нужно делать что-то вроде уже упомянутого:
NOT EXISTS (SELECT ID1 FROM T1,T2 WHERE T1.Ф=T2.Ф AND ...). А такая конструкция почти точно будет эквивалентна твоей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.