Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000) / 13 сообщений из 13, страница 1 из 1
21.12.2001, 12:24
    #32019570
XDefender
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
Вот к примеру есть:

UPDATE FacturesTVA
SET State=2 -- Освобождаем
WHERE ID IN (SELECT NumberTVA FROM INSERTED)

С Инер джоин выглядит так

UPDATE FacturesTVA
SET State=2 -- Освобождаем
FROM FacturesTVA F INNER JOIN INSERTED I ON WHERE F.ID=I.NumberTVA

Причем при условии, что в FacturesTVA окола 8000 записей, а в INSERTED в 95% 1 запись ?
...
Рейтинг: 0 / 0
21.12.2001, 12:56
    #32019574
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
Подозреваю, что планы будет практически идентичны.
...
Рейтинг: 0 / 0
21.12.2001, 14:59
    #32019584
SergeK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
На мой взгляд полезно иметь тестовый сервер, который послабже боевого по производительности, и на нем и смотреть Execution Plan каждого запроса. Естессно, чтобы данных было столько же, сколько и на боевом. Иначе на практически пустой базе разницы можно и не заметить.
...
Рейтинг: 0 / 0
21.12.2001, 15:16
    #32019585
Alex_open_m
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
Думаю, что планы будут одинаковы, если все в порядке с индексной статистикой. Запросы в принципе тривиальны и наверняка подходят под типовые шаблоны выполнения
Я наблюдал расхождение в планах подобного рода запросов, когда внутри IN был подзапрос из временной таблицы или количество таблиц в запросе было дастаточно велико (от 10).

А как известно, если в запросе более 16 таблиц (касательно 7 сервера), то там уж как фишки лягут....
...
Рейтинг: 0 / 0
22.12.2001, 19:43
    #32019616
SoNiKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
А если так:

UPDATE FacturesTVA
SET State=2 -- Освобождаем
WHERE ID exists (SELECT NumberTVA FROM INSERTED)
...
Рейтинг: 0 / 0
22.12.2001, 20:00
    #32019617
SoNiKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
А вот ещё вариантик:

UPDATE FacturesTVA
SET State=2 -- Освобождаем
FROM INSERTED
WHERE ID = NumberTVA
...
Рейтинг: 0 / 0
24.12.2001, 08:01
    #32019649
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
Вот с этим запросом:

UPDATE FacturesTVA
SET State=2 -- Освобождаем
WHERE ID IN (SELECT NumberTVA FROM INSERTED)

будут труднопонимаемые проблемы на sql2000, если NumberTVA в Inserted поимеет хотя бы одно значение NULL. У меня на лбу здоровенная шишка от этой грабли.
...
Рейтинг: 0 / 0
24.12.2001, 12:25
    #32019681
Alex_open_m
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
Касательно предыдущего замечания - я также иногда замечал, что INNER соединение по NULL полям (то есть отсутствие соединения как такового) губительно сказывается на плане выполнения, если записей с NULL довольно много и оптимизатору это известно.
...
Рейтинг: 0 / 0
26.12.2001, 14:18
    #32019878
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
a) NULL-поля всегда отрицательно сказываются на качестве работы оптимизатора;
б) Использование INNER JOIN вместо IN в общем случае - неважно, а иногда неверно;
в) Быстрее IN всегда предложение EXISTS.

Вот типичная запись в IN:
TABLE1.ID IN (SELECT ID FROM TABLE2)

Вот более быстрая запись в EXISTS:
EXISTS(SELECT TOP 1 1 FROM TABLE2 WHERE (TABLE2.ID = TABLE1.ID))

Замечания:
1) Почему-то SQL Server не всегда понимает, что достаточно найти любую запись для истинности EXISTS, поэтому мы ставим TOP 1 (обычно помогает в случае неуникальности).
2) Выборка константы здесь быстрее, чем выборка поля. Тоже недоделка оптимизатора.
...
Рейтинг: 0 / 0
26.12.2001, 14:52
    #32019884
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
> 1) Почему-то SQL Server не всегда понимает, что достаточно найти любую запись для истинности EXISTS, поэтому мы ставим TOP 1 (обычно помогает в случае неуникальности).

Это справедливо только для 7.0 из-за недоделки оптимизатора. В 2000 исправлено и TOP уже писать не нужно, будет безразлично.

> 2) Выборка константы здесь быстрее, чем выборка поля. Тоже недоделка оптимизатора.

Это утверждение не находит подверждения. Широко распространенный миф.
...
Рейтинг: 0 / 0
26.12.2001, 15:02
    #32019887
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
Красивые у Акжана рассуждения про EXISTS(SELECT TOP 1 1 ..., но истина дороже

Subqueries with EXISTS

When a subquery is introduced with the keyword EXISTS, it functions as an existence test. The WHERE clause of the outer query tests for the existence of rows returned by the subquery. The subquery does not actually produce any data; it returns a value of TRUE or FALSE.

Так что писать SELECT TOP 1 1 - это самообман, разницы с select * никакой нет, выборки никаких данных не происходит
...
Рейтинг: 0 / 0
26.12.2001, 15:10
    #32019888
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
У Вас также красивые с точки зрения теории рассуждения. Есть только одна просьба - проверьте их на реальном сервере.

Просьба только проверять мои варианты на неуникальном индексе. Вот тогда и посмотрим, равны ли по производительнсти варианты с EXISTS(SELECT "FolderAccountId") и с EXISTS(SELECT TOP 1 1)...

Боюсь, что Вы будете удивлены. Кстати, аналогичные моим выводы сделал на своей БД Анатолий Тенцер. TOP 1 реально крайне нужен при выборке на неуникальном индексе, и может быть опущен при выборке по уникальному индексу.
...
Рейтинг: 0 / 0
26.12.2001, 15:35
    #32019890
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
Вынужден тут же сам себя поправить:
Как оказалось, в SQL Server 2000 Service Pack 1 эту проблему оптимизатора решили. Все запросы выдают один и тот же план, по крайней мере, для моихтестовых запросов.

В SQL Server 2000 без сервис паков эта проблема имеет место быть (у нас есть несколько серверов, без SP, с SP1 и с SP2).
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000) / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]