powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle or MSSQL 2000. Кто быстрее?
25 сообщений из 41, страница 1 из 2
Oracle or MSSQL 2000. Кто быстрее?
    #32064057
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Кто-нибудь может сказать, почему идентичные запросы выполняются разное количество времени на 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? Или в морг????
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064062
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Планы нужно показать. Без планов МС всегда быстрее ;-)
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064066
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит планы? Прошу прощения за идиотский запрос. Я еще новичок в Oracle.
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064071
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
execution plan'ы

в Оракл - это команда explain plan. В МС - не знаю, но что-то аналогичное обязано быть.
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064111
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите, а при чем тут планы выполнения? Я не могу понять. Я еще раз говорю, что структура таблиц и данные на обоих серверах идентичны! А MS выполняет запрос на несколько порядков быстрее!!!
Ну скажите же мне, где что я не так делаю?
И вообще как народ относится к вопросам, использующим Join?
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064114
Guest1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты может быть делаешь все правильно, а oracle нет, поэтому и нужны планы выполнения
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064118
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exec dbms_stats.gather_schema_stats(<юзернэйм>);
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064119
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок. Хорошо. Но как мне получить эти самые планы?
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064120
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Скажите, а при чем тут планы выполнения? Я не могу
>понять. Я еще раз говорю, что структура таблиц и
>данные на обоих серверах идентичны! А MS выполняет
>запрос на несколько порядков быстрее!!!
>Ну скажите же мне, где что я не так делаю?
>И вообще как народ относится к вопросам,
>использующим Join?

интересно, ели у программиста не работает код он что должен делать - кричать "что я не так делаю?" или как минимум запустить дебаггер? Вот explain plan и является такого рода дебаггером для скл запросов в оракле.
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064123
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Ок. Хорошо. Но как мне получить эти самые планы

Каким тулсом Вы пользуетесь для запуска запроса?
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064128
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus Worksheet
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064137
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дайте команду:

set autot on explain

а затем выполните свой запрос.
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064139
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не парьте вы его планами - пусть сначала статистику соберет и тогда стоимостной оптимизатор хотя бы отработает
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064142
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>не парьте вы его планами - пусть сначала статистику
>соберет и тогда стоимостной оптимизатор хотя бы
>отработает

А вдруг у него там RULE или что-то еще стоит?
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064144
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После попытки выполнить команду
set autot on explain
получил вот что:
SP2-0613: Unable to verify PLAN_TABLE format or existence
SP2-0611: Error enabling EXPLAIN report
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064148
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запустите скрипт $ORACLE_HOME/rdbms/admin/utlxplan.sql
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064155
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AM
Действительно, если у вас там все по дефолту настроено, то лучше начать со сбора статистики. Вообще, это подразумевалось и в предыдущих советах

2 .dba
ты вроде faq планировал по этому вопросу? ;-)
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064157
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 4  Card= 1  Bytes= 5 )
    1      0    SORT (AGGREGATE)
    2      1      FILTER
    3      2        INDEX (FAST FULL SCAN) OF 'SYS_C0038082' (UNIQUE) (Cos
          t= 4  Card= 4993  Bytes= 24965 )

    4      2        NESTED LOOPS (Cost= 11  Card= 1  Bytes= 27 )
    5      4          NESTED LOOPS (Cost= 4  Card= 7  Bytes= 133 )
    6      5            MERGE JOIN (CARTESIAN) (Cost= 4  Card= 7  Bytes= 112 )
    7      6              TABLE ACCESS (FULL) OF 'Сотрудники1' (Cost= 1  Car
          d= 1  Bytes= 6 )

    8      6              SORT (JOIN) (Cost= 3  Card= 7  Bytes= 70 )
    9      8                TABLE ACCESS (BY INDEX ROWID) OF 'Товары3' (Co
          st= 3  Card= 7  Bytes= 70 )

   10      9                  INDEX (RANGE SCAN) OF 'SYS_C0038090' (UNIQUE
          ) (Cost= 2  Card= 7 )

   11      5            INDEX (UNIQUE SCAN) OF 'SYS_C0038039' (UNIQUE)
   12      4          TABLE ACCESS (BY INDEX ROWID) OF 'Товар1' (Cost= 1  Ca
          rd= 50060  Bytes= 400480 )

   13     12            INDEX (UNIQUE SCAN) OF 'SYS_C0038063' (UNIQUE)



Вот это план? Что можно сказать по нему?
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064163
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы попробовал вот что сделать

1. Переписать запрос через обычное соединение (join) таблиц. Так как сейчас написано через вложенные множеств. EXISTS - обычно не делают, да и некрасиво выглядит.

2. MERGE JOIN (CARTESIAN) (Cost=4 Card=7 Bytes=112) - эта строчка говорит, что нет однозначного условия соединения таблиц и каждая строка одной таблицы сравнивается с каждой строкой другой таблицы (декартово произведение). А это редко когда бывает оправданным
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064165
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ты вроде faq планировал по этому вопросу? ;-)

так это и идет отладка/тестирование вопроса в faq ;-)

2 Andy Mezentsev

Тут я полностью присоединяюсь к советам killed.

Но все-таки есть подозрение, что статистика не свежая, а времен импорта, я ошибаюсь?

Кроме того, еще вопрос - все индексы задействованные в плане выполнения - являются индексами по соединяемым колонкам?
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064166
mms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mms
Гость
Может я запрос не правильно понял, но попробуй вот такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT  "A1" .* 
FROM  "Накладная1"  A1, "Товары3"  A2, "Товар1"  A3, "ЮрЛицо1"  A4, "Сотрудники1"  A5
WHERE 
( "A1" . "DocID"  =  "A2" . "LinkDetail" ) AND 
( "A2" . "Товар"  =  "A3" . "DocID" ) AND 
( "A3" . "Производитель"  =  "A4" . "DocID" ) AND 
(( "A4" . "DocID"  =  "A5" . "LinkDetail" ) AND
( "A5" . "Сотрудник"  =  9 ))


Если что, пришли план по этому запросу, будем хе-хе хинты расставлять.
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064170
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT * FROM (
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" . "Производитель" (+)
                ))
 WHERE  "Deleted" = 0  
ORDER BY  "DocID"  ASC
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064179
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2mms

скорее всего да, неправильно.
даже на первый взгляд это не то, что мне нужно. взять хотя бы count(...)
Но вот статистика:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 1965  Card= 1  Bytes= 32 
          )

    1      0    SORT (AGGREGATE)
    2      1      NESTED LOOPS (Cost= 1965  Card= 27161  Bytes= 869152 )
    3      2        HASH JOIN (Cost= 1965  Card= 27161  Bytes= 733347 )
    4      3          NESTED LOOPS (Cost= 81  Card= 2275  Bytes= 38675 )
    5      4            NESTED LOOPS (Cost= 1  Card= 1  Bytes= 9 )
    6      5              TABLE ACCESS (FULL) OF 'Сотрудники1' (Cost= 1  Car
          d= 1  Bytes= 6 )

    7      5              INDEX (UNIQUE SCAN) OF 'SYS_C0038039' (UNIQUE)
    8      4            TABLE ACCESS (FULL) OF 'Товар1' (Cost= 80  Card= 5006 
           0  Bytes= 400480 )

    9      3          TABLE ACCESS (FULL) OF 'Товары3' (Cost= 379  Card= 5541 
           90  Bytes= 5541900 )

   10      2        INDEX (UNIQUE SCAN) OF 'SYS_C0038082' (UNIQUE)
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064180
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ora600
А Ваш запрос опять привел мой Oracle в ступор. Уже пошла 25 минута - а он молчит :(((

кстати, сервак меня 8.1.7
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064186
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все ж надо переписать запрос с JOIN'ами как советовали!
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle or MSSQL 2000. Кто быстрее?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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