Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
Вот к примеру есть: 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 запись ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2001, 12:24 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
Подозреваю, что планы будет практически идентичны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2001, 12:56 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
На мой взгляд полезно иметь тестовый сервер, который послабже боевого по производительности, и на нем и смотреть Execution Plan каждого запроса. Естессно, чтобы данных было столько же, сколько и на боевом. Иначе на практически пустой базе разницы можно и не заметить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2001, 14:59 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
Думаю, что планы будут одинаковы, если все в порядке с индексной статистикой. Запросы в принципе тривиальны и наверняка подходят под типовые шаблоны выполнения Я наблюдал расхождение в планах подобного рода запросов, когда внутри IN был подзапрос из временной таблицы или количество таблиц в запросе было дастаточно велико (от 10). А как известно, если в запросе более 16 таблиц (касательно 7 сервера), то там уж как фишки лягут.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2001, 15:16 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
А если так: UPDATE FacturesTVA SET State=2 -- Освобождаем WHERE ID exists (SELECT NumberTVA FROM INSERTED) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2001, 19:43 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
А вот ещё вариантик: UPDATE FacturesTVA SET State=2 -- Освобождаем FROM INSERTED WHERE ID = NumberTVA ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2001, 20:00 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
Вот с этим запросом: UPDATE FacturesTVA SET State=2 -- Освобождаем WHERE ID IN (SELECT NumberTVA FROM INSERTED) будут труднопонимаемые проблемы на sql2000, если NumberTVA в Inserted поимеет хотя бы одно значение NULL. У меня на лбу здоровенная шишка от этой грабли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2001, 08:01 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
Касательно предыдущего замечания - я также иногда замечал, что INNER соединение по NULL полям (то есть отсутствие соединения как такового) губительно сказывается на плане выполнения, если записей с NULL довольно много и оптимизатору это известно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2001, 12:25 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
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) Выборка константы здесь быстрее, чем выборка поля. Тоже недоделка оптимизатора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 14:18 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
> 1) Почему-то SQL Server не всегда понимает, что достаточно найти любую запись для истинности EXISTS, поэтому мы ставим TOP 1 (обычно помогает в случае неуникальности). Это справедливо только для 7.0 из-за недоделки оптимизатора. В 2000 исправлено и TOP уже писать не нужно, будет безразлично. > 2) Выборка константы здесь быстрее, чем выборка поля. Тоже недоделка оптимизатора. Это утверждение не находит подверждения. Широко распространенный миф. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 14:52 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
Красивые у Акжана рассуждения про 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 * никакой нет, выборки никаких данных не происходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 15:02 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
У Вас также красивые с точки зрения теории рассуждения. Есть только одна просьба - проверьте их на реальном сервере. Просьба только проверять мои варианты на неуникальном индексе. Вот тогда и посмотрим, равны ли по производительнсти варианты с EXISTS(SELECT "FolderAccountId") и с EXISTS(SELECT TOP 1 1)... Боюсь, что Вы будете удивлены. Кстати, аналогичные моим выводы сделал на своей БД Анатолий Тенцер. TOP 1 реально крайне нужен при выборке на неуникальном индексе, и может быть опущен при выборке по уникальному индексу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 15:10 |
|
||
|
Что лучше и быстрее, испольование IN или INNER JOIN ? (MS SQL 2000)
|
|||
|---|---|---|---|
|
#18+
Вынужден тут же сам себя поправить: Как оказалось, в SQL Server 2000 Service Pack 1 эту проблему оптимизатора решили. Все запросы выдают один и тот же план, по крайней мере, для моихтестовых запросов. В SQL Server 2000 без сервис паков эта проблема имеет место быть (у нас есть несколько серверов, без SP, с SP1 и с SP2). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 15:35 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32019888&tid=1824473]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 225ms |
| total: | 370ms |

| 0 / 0 |
