|
|
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
как переписать данный запрос используя EXIST вместо JEFT JOIN ? Код: plaintext 1. 2. 3. 4. Regards, Snark ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 09:37:12 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
SELECT R.ID FROM R WHERE R.ID IN ( SELECT C.ID FROM C WHERE C.Name IS NULL OR C.Name = 123 ) Только здесь не учтен OUTER ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 09:44:52 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Попробуй так: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 09:51:16 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
to Timur : вот как раз проверки на NULL и хотелось бы избежать. Так как с использованием LEFT JOIN проходится делат проверку на NULL, что, как я понимаю блокирует использование индекса при поиске по полю C.Name, и, соответственно, уменьшает производительность запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:12:15 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Кстати комментарий к варианту Тимура - при LEFT JOIN - NULL появляется для теx записей в R таблице которым нет соответствуюших записей в таблице C, следовательно, C.Name не может быть NULL когда C.ID = R.ID Более того, NULL значения для поля Name в таблице C не разрешены ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:26:09 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
SELECT R.ID FROM R WHERE EXISTS(SELECT top 1 from C where R.ID=C.ID AND C.Name = 123) OR NOT EXISTS(SELECT top 1 from C where R.ID=C.ID ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:33:06 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
И наконец формулировка задачи, что видимо необходимо было сделать с самого начала :) найти все R.ID в Таблице R для которых нет соответствуюших записей в таблице C, ПЛЮС для которых есть соответствуюшие записи в таблице C И значение C.NAME поля = 123 Кстати, сам я как раз пришел к такому же варианты что и MiCe, но выглядит ето как то громоздко (2 вложенных запроса), поетому решил проверить себя здесь, спасибо за обсуждение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:39:20 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
преимущество с exists... сравни скорость... особенно если таблицы большие.... если с outer строится пересечение таблиц то с exists толко проверяется.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:46:16 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Непонимаю предыдущие ответы. Разве они возвращают то, чего добился автор LEFT OUTER JOIN? Предлагаю свой вариант: SELECT R.ID FROM C INNER JOIN R ON C.ID=R.ID WHERE C.Name = 123 UNION ALL SELECT R.ID FROM R WHERE 0=(SELECT count(C.ID) FROM C WHERE C.ID=R.ID) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:47:50 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
не успел прочитать ответ MICE Я предпочел бы вариант MICE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:53:07 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Народ, может я чего не допонимаю? Чем не устраивает такой запрос: SELECT R.ID FROM R WHERE R.ID IN (SELECT C.ID FROM C WHERE C.NAME=123) OR R.ID NOT IN (SELECT C.ID FROM C) IMHO, проверок меньше, условия соблюдены -> скорость выше... Может я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 12:56:26 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
оператор IN тормоз по сравнению с exists ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 13:04:33 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
MiCe : интересно а как здесь сработает SELECT TOP 1? это не накладно получиться для каждого потенциального вхождения выбрать все а потом отрезать верхушку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 13:43:55 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
TOP 1 никогда не выберает все..... сервер ищет первое вхождение.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 13:53:53 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
MiCe Я тоже так подозреваю ;) жаль не могу топик найти совсем недавно читал об обратном ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:00:21 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
У меня left join отработал в полтора раза быстрее, чем if exists. Таблички по несколько тысяч записей, имеются индексы по R.ID и C.ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:03:31 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
я тоже чего-то не понимаю ( создал r и c по 10000 и left join отработал за 30ms а exists все 110 ((( Прокоментируйте плз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:15:22 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
создал r и c по 10000 и left join отработал за 30ms а exists все 110 ((( Прокоментируйте плз А просто все, при джоине один запрос с фильтром, а при использовании exists получаем один запрос с подзапросами равным по количеству строкам основного запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:17:45 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
а скриптик?.... а что у вас в c.name? а поднимите количество записей хотя бы до 1000000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:25:26 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
т.е. результат будет виден на таблицах с гораздо большим обемом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:28:30 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
MiCe, как бы Вам не хотелось, но exists не будет быстрее left join-а. Возьмите для примера оба варианта и посмотрите их планы выполнения, сразу все станет понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:30:36 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
вот блин.... я сам пользуюсь внешними объединениями.... но вот иногда... приходится извращатся.... смотреть на данные надо... если б все таблицы только из ключей и состояли... ;)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:32:53 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
если б все таблицы только из ключей и состояли... ;)) А причем здесь ключи? Сами прикиньте что проще, выбрать данные и отфильтровать или сделать по каждой проверке запрос, пусть даже он и прерывается при первом совпадении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:36:17 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
угу.... у меня один раз лога в temdb не хватило... на одно такое внешнее объединение ... при чем одна таблица своя а другая вообще из внешнего источника... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:39:24 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
на одно такое внешнее объединение ... при чем одна таблица своя а другая вообще из внешнего источника... Еденичные исключения не являются правилом, не так ли? А Вы уже товарисчам нарассказывали... ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:43:53 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
как заменить LEFT JOIN на EXIST ? собственно subj.... или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:45:33 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
истина где-то рядом ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:46:33 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
или что? преимущество с exists... сравни скорость... особенно если таблицы большие.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:47:29 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
>> оператор IN тормоз по сравнению с exists Где об этом написано? Читаем MSDN: EXISTS Specifies a subquery to test for the existence of rows. Returns TRUE if a subquery contains any rows. IN Determines if a given value matches any value in a subquery or a list. If the value is equal to any value returned by subquery or is equal to any expression from the comma-separated list, the result value is TRUE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:54:00 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
скажем так.... если таблица R не большая а таблица C большая..... с exists быстро.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 14:55:19 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
2 SilencerID проверь сам... на счет TOP 1 если без сортировки то вернет любую первую.... возможно что с exists теперь уже и не нужно.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 15:02:00 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
MiCe а поднимите количество записей хотя бы до 1000000 вообщем-то JOIN - 5.317 ss EXISTS - 4.808 ss по видимому дальше разница дальше будет расти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 15:04:31 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
это назувается накладные расходы при нехватке памяти... а если статистика верная может еще вырасти.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 15:08:32 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
to keystop: А проверь-ка для сравнения запрос: SELECT R.ID FROM R WHERE R.ID IN (SELECT TOP 1 C.ID FROM C WHERE C.NAME=123) OR R.ID NOT IN (SELECT C.ID FROM C) to MiCe: Ну, TOP 1 и я могу добавить :) (см. выше) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 16:39:22 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
JOIN - 5.317 ss EXISTS - 4.808 ss Говорите точно скока ве..., тьфу, т.е. скока раз меряли? А индекс по фильтруемым полям имеется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 16:54:34 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
to keystop: хотя нет, проверь этот, без ТОП 1, иначе ошибка - проверку дополнительную нужно: SELECT R.ID FROM R WHERE R.ID IN (SELECT C.ID FROM C WHERE C.NAME=123) OR R.ID NOT IN (SELECT C.ID FROM C) Сколько от мс потянет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 17:05:18 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Предыдуший пост - цитата из этого источника : http://www.sql-server-performance.com/transact_sql.asp И оттуда же : If you currently have a query that uses NOT IN, which offers poor performance because the SQL Server optimizer has to use a nested table scan to perform this activity, instead try to use one of the following options instead, all of which offer better performance: Use EXISTS or NOT EXISTS Use IN. Perform a LEFT OUTER JOIN and check for a NULL condition [6.5, 7.0, 2000] Updated 5-31-2002 Может использование EXIST instead of LEFT JOIN ето просто мода, но скорее всего нужно проверять на каждом конкретном случае Хотя, было бы интересно понять при каких условиях один метод производительнее другого. Regards, Snark ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 19:58:36 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Индекс по полю C.Name есть. из-за етого индекса, в том числе я и хочу уйти от LEFT JOIN, так как, как я понимаю, при проверке на NULL индексы использоваться не могут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 20:14:19 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
дополнительные детали, количество записей в таблице C значительно (примерно в 10 раз) меньше чем в таблице R ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 20:21:46 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
MiCe TOP 1 никогда не выберает все..... сервер ищет первое вхождение.... По сути это верно, но на практике получается следующее: не знаю как там SQL2000, но SQL7 выдает лучшие планы для select 1, чем для select top 1 1, как для exists, так и для not exists. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 20:27:43 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
2 Alexes... top это привычка.... при exists он не нужен... он подразумеватся по умолчанию.... думаю что top 1 1 даст тоже самое.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 20:57:36 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
to Snark Ну смотреть надо в каждом конкретном случае, что применять. Все зависит от количества условий в выражении. В даном случае, все же лучше NOT IN. Но за ссылку спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 22:54:29 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
и чем же ш лучше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 23:29:21 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Практика - критерий истины, результаты теста : Как видно LEFT JOIN далеко впереди, EXIST ненамного опережает NOT IN Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Regards, Snark ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2002, 01:17:15 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Sorry, disregard last report, this is the correct one Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Snark ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2002, 01:24:30 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
покажи запросы с count? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2002, 03:01:01 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
меня болше поражает количество строк..... у меня оно разное... отсюда вывод что запросы с left и exists не тождественны.... вот скриптик.... немного урезанный... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2002, 03:15:35 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2002, 03:16:05 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
а если добавить group by R.ID ?.... ланенько.... пойду ка я спать....устал.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2002, 03:20:23 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
To MiCe : у меня количество строк абсолютно одинаковое для всех видов запросов, отсюда вывод,- проблемы с разницей в количестве строк вызваны оператором LIKE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2002, 03:27:42 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
все равно не понятно.... так группировка не меняет результат? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2002, 03:36:11 |
|
||
|
как заменить LEFT JOIN на EXIST ?
|
|||
|---|---|---|---|
|
#18+
ага... из за like .... дошло.... не нужно поспать.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2002, 03:40:01 |
|
||
|
|

start [/forum/topic.php?all=1&fid=46&tid=1818829]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
5ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 306ms |

| 0 / 0 |
