|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Здравствуйте! Кто-нибудь может сказать, почему идентичные запросы выполняются разное количество времени на MSSQL и Oracle? вот текст запроса MSSQL: SELECT [A39].* FROM [Накладная] A39 WITH (NOLOCK) WHERE ((EXISTS (SELECT [A40].[Index] FROM [Товары] A40 WITH (NOLOCK) LEFT JOIN [Товар] A35JT1 WITH (NOLOCK) ON ([A35JT1].[DocID]=[A40].[Товар]) LEFT JOIN [ЮрЛицо] A32JT2 WITH (NOLOCK) ON ([A32JT2].[DocID]=[A35JT1].[Производитель]) WHERE ([A40].[LinkDetail]=[A39].[DocID]) AND (EXISTS (SELECT [A33].[Index] FROM [Сотрудники] A33 WITH (NOLOCK) WHERE ([A33].[LinkDetail]=[A32JT2].[DocID]) AND ([A33].[Сотрудник]=9)))))and([A39].[Deleted]=0)) AND (([A39].[DocID]<100017)) ORDER BY [A39].[DocID] DESC и вот текст запроса Oracle: SELECT "A1".* FROM "Накладная1" A1 WHERE ((EXISTS (SELECT "A2"."Index" FROM "Товары3" A2 ,"Товар1" A3,"ЮрЛицо1" A4 WHERE ("A2"."LinkDetail"="A1"."DocID") AND (EXISTS (SELECT "A5"."Index" FROM "Сотрудники1" A5 WHERE ("A5"."LinkDetail"="A4"."DocID") AND ("A5"."Сотрудник"=9))) AND ("A3"."DocID" = "A2"."Товар"(+)) AND ("A4"."DocID" = "A3"."Производитель"(+)))) and ("A1"."Deleted"=0)) ORDER BY "A1"."DocID" ASC MS выполняет такой запрос за пару секунд. Oracle задумывается _ОЧЕНЬ_ долго. Я не дождался ответа. снял задачу после 7 часов.... Пробовал изменить запрос Oracle так: SELECT "A1".* FROM "Накладная1" A1 WHERE EXISTS (SELECT NULL FROM "Товары3" A2 WHERE ("A2"."LinkDetail" = "A1"."DocID") AND EXISTS (SELECT NULL FROM "Товар1" A3 WHERE ("A3"."DocID" = "A2"."Товар") AND EXISTS (SELECT NULL FROM "ЮрЛицо1" A4 WHERE ("A4"."DocID" = "A3"."Производитель") AND EXISTS (SELECT NULL FROM "Сотрудники1" A5 WHERE ("A5"."Сотрудник" = 9) AND ("A5"."LinkDetail" = "A4"."DocID"))))); Этот запрос выполняется около 5 минут. А можно быстрее? Мне говорили, что Oracle НАМНОГО быстрее MSSQL.... Структура таблиц, индексов идентична. Есть ли тут тут гуру, кто объяснит мне, в чем дело и разбудит во мне любовь к Oracle? Или в морг???? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 14:25 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Планы нужно показать. Без планов МС всегда быстрее ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 14:30 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Что значит планы? Прошу прощения за идиотский запрос. Я еще новичок в Oracle. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 14:33 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
execution plan'ы в Оракл - это команда explain plan. В МС - не знаю, но что-то аналогичное обязано быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 14:34 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Скажите, а при чем тут планы выполнения? Я не могу понять. Я еще раз говорю, что структура таблиц и данные на обоих серверах идентичны! А MS выполняет запрос на несколько порядков быстрее!!! Ну скажите же мне, где что я не так делаю? И вообще как народ относится к вопросам, использующим Join? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:07 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Ты может быть делаешь все правильно, а oracle нет, поэтому и нужны планы выполнения ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:12 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
exec dbms_stats.gather_schema_stats(<юзернэйм>); ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:18 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Ок. Хорошо. Но как мне получить эти самые планы? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:19 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
>Скажите, а при чем тут планы выполнения? Я не могу >понять. Я еще раз говорю, что структура таблиц и >данные на обоих серверах идентичны! А MS выполняет >запрос на несколько порядков быстрее!!! >Ну скажите же мне, где что я не так делаю? >И вообще как народ относится к вопросам, >использующим Join? интересно, ели у программиста не работает код он что должен делать - кричать "что я не так делаю?" или как минимум запустить дебаггер? Вот explain plan и является такого рода дебаггером для скл запросов в оракле. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:19 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
>Ок. Хорошо. Но как мне получить эти самые планы Каким тулсом Вы пользуетесь для запуска запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:21 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
SQL*Plus Worksheet ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:26 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Дайте команду: set autot on explain а затем выполните свой запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:36 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
не парьте вы его планами - пусть сначала статистику соберет и тогда стоимостной оптимизатор хотя бы отработает ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:38 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
>не парьте вы его планами - пусть сначала статистику >соберет и тогда стоимостной оптимизатор хотя бы >отработает А вдруг у него там RULE или что-то еще стоит? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:41 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
После попытки выполнить команду set autot on explain получил вот что: SP2-0613: Unable to verify PLAN_TABLE format or existence SP2-0611: Error enabling EXPLAIN report ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:43 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
запустите скрипт $ORACLE_HOME/rdbms/admin/utlxplan.sql ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 15:49 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
2 AM Действительно, если у вас там все по дефолту настроено, то лучше начать со сбора статистики. Вообще, это подразумевалось и в предыдущих советах 2 .dba ты вроде faq планировал по этому вопросу? ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 16:14 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#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.
Вот это план? Что можно сказать по нему? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 16:14 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
я бы попробовал вот что сделать 1. Переписать запрос через обычное соединение (join) таблиц. Так как сейчас написано через вложенные множеств. EXISTS - обычно не делают, да и некрасиво выглядит. 2. MERGE JOIN (CARTESIAN) (Cost=4 Card=7 Bytes=112) - эта строчка говорит, что нет однозначного условия соединения таблиц и каждая строка одной таблицы сравнивается с каждой строкой другой таблицы (декартово произведение). А это редко когда бывает оправданным ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 16:33 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
>ты вроде faq планировал по этому вопросу? ;-) так это и идет отладка/тестирование вопроса в faq ;-) 2 Andy Mezentsev Тут я полностью присоединяюсь к советам killed. Но все-таки есть подозрение, что статистика не свежая, а времен импорта, я ошибаюсь? Кроме того, еще вопрос - все индексы задействованные в плане выполнения - являются индексами по соединяемым колонкам? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 16:43 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Может я запрос не правильно понял, но попробуй вот такой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Если что, пришли план по этому запросу, будем хе-хе хинты расставлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 16:44 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 16:51 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
2mms скорее всего да, неправильно. даже на первый взгляд это не то, что мне нужно. взять хотя бы count(...) Но вот статистика: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 17:20 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
2ora600 А Ваш запрос опять привел мой Oracle в ступор. Уже пошла 25 минута - а он молчит :((( кстати, сервак меня 8.1.7 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 17:23 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
И все ж надо переписать запрос с JOIN'ами как советовали! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 17:39 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
2mahoune Я же сказал, что я переписал, как посоветовал ora600. И что? Сервер уже 40 минут в глубоком ступоре. По-моему использовать join более чем на одну таблицу в Oracle нельзя. по крайней мере у меня не получается. Все это глубокое IMHO. Так что сильно не пинайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 17:44 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
запрос не идентичен ms-овскому : в ms-овском к ТОВАРЫ присоединяется ТОВАР и ЮРЛИЦО, а в ораклевом вообще черт знает что. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 17:51 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Как Вы объясняете ... SELECT "A2"."Index" FROM ... "A2"."Товар"(+) ??? Выясняете НАЛИЧИЕ ТОГО ЧТО НЕ ОБЯЗАТЕЛЬНО ? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 17:57 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
А где еще это условие из ms запроса потерялось? AND (([A39].[DocID]<100017)) Кроме того было 2 предложения: 1. Переписать запрос без exist 2. Собрать статистику Товарищ их по каким-то причинам проигнорировал и теперь утверждает, что в оракле нельзя джоинить больше двух таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 17:59 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Переписал запрос. Теперь он выполняется примерно за 1 минуту. Мне не нравится в статистике строчка 7(там где CARTESIAN). Кто-нибудь поможет переписать запрос без EXISTS? Вот текст запроса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 18:22 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Так был же выше уже переписан. Вы что не все постинги в топике читаете? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 18:27 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
to Andy Написав запрос я использовал ваш второй оракловый вариант запроса, который работал 5мин. Я немного ошибся. Чтобы соответствовал этому второму запросу с exist надо в моем расставить скобочки: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Если что давайте план. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 18:30 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
2.dba Где??? Тот запрос, что написал ora600 вообще не работает - сервер впадает в тяжелый ступор. Укажите, пожалйста, где этот запрос? может я что проглядел? :( ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 18:35 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Это было на один постинг выше чем запроc ORA600, тот который повторил сейчас mms. Единственное с чем я несогласен это то что скобки тут будут хоть на что-то влиять - тут везде AND, а значит порядок операций не сущесвенен. А как все-таки со статистикой? Когда она собиралась? И почему в ms запросе на одно условие больше? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 18:50 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
На одно условие больше - так это просто copy/paste виноват. В реальных тестах этого условия нет. НО ВОТ ОН ЗАПРОС! Работает _ВСЕГО_ 2 секунды: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
А вот ее план Код: 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.
Но хочется продолжить обсуждения и добиться более значительного превосходства над MS :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 19:25 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Поставьте инициализационный параметр optimizer_index_cost_adj = 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 19:34 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
Плюсики из запроса убери будет по быстрее :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 19:34 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
>Плюсики из запроса убери будет по быстрее :) так, а если человеку принципиально нужны outer join, то тогда что? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 19:35 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
2.dba Сорри за глупый вопрос, но где же поставить этот самый параметр? (optimizer_index_cost_adj = 1) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 19:37 |
|
Oracle or MSSQL 2000. Кто быстрее?
|
|||
---|---|---|---|
#18+
SQL> alter session set optimizer_index_cost_adj = 1; но это только на уровне сессии (в которой будешь выполнять запрос) - чтоб попробовать. А если понравится :-), то надо отредактировать файл init<SID>.ora и перестартовать базу. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2002, 19:41 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1992823]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
others: | 258ms |
total: | 413ms |
0 / 0 |