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

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

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

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

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

set autot on explain

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

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

2 .dba
ты вроде faq планировал по этому вопросу? ;-)
...
Рейтинг: 0 / 0
01.11.2002, 16:14
    #32064157
Andy Mezentsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle or MSSQL 2000. Кто быстрее?
Код: 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
01.11.2002, 16:33
    #32064163
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle or MSSQL 2000. Кто быстрее?
я бы попробовал вот что сделать

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

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

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

2 Andy Mezentsev

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

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

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

Код: 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
01.11.2002, 16:51
    #32064170
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle or MSSQL 2000. Кто быстрее?
Код: 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
01.11.2002, 17:20
    #32064179
Andy Mezentsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle or MSSQL 2000. Кто быстрее?
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
01.11.2002, 17:23
    #32064180
Andy Mezentsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle or MSSQL 2000. Кто быстрее?
2ora600
А Ваш запрос опять привел мой Oracle в ступор. Уже пошла 25 минута - а он молчит :(((

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


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