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

Я же сказал, что я переписал, как посоветовал ora600.
И что? Сервер уже 40 минут в глубоком ступоре.

По-моему использовать join более чем на одну таблицу в Oracle нельзя. по крайней мере у меня не получается.
Все это глубокое IMHO. Так что сильно не пинайте.
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064194
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запрос не идентичен ms-овскому :
в ms-овском к ТОВАРЫ присоединяется ТОВАР и ЮРЛИЦО,
а в ораклевом вообще черт знает что.
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064198
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как Вы объясняете
...
SELECT "A2"."Index" FROM
...
"A2"."Товар"(+)

???
Выясняете НАЛИЧИЕ ТОГО ЧТО НЕ ОБЯЗАТЕЛЬНО ?
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064199
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где еще это условие из ms запроса потерялось?

AND (([A39].[DocID]<100017))

Кроме того было 2 предложения:
1. Переписать запрос без exist
2. Собрать статистику

Товарищ их по каким-то причинам проигнорировал и теперь утверждает, что в оракле нельзя джоинить больше двух таблиц.
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064206
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписал запрос. Теперь он выполняется примерно за 1 минуту. Мне не нравится в статистике строчка 7(там где CARTESIAN).
Кто-нибудь поможет переписать запрос без EXISTS?
Вот текст запроса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT 
  Count(*)
FROM  "Накладная1"  A39 
WHERE (EXISTS (SELECT  "A40" . "Index"  
               FROM  "Товары3"  A40,  "Товар1"  A35JT1,  "ЮрЛицо1"  A32JT2 
               WHERE ( "A40" . "Товар" = "A35JT1" . "DocID" (+)) AND 
                     ( "A32JT2" . "DocID" (+)= "A35JT1" . "Производитель" ) AND 
                     ( "A40" . "LinkDetail" = "A39" . "DocID" ) AND 
                     (EXISTS (SELECT  "A33" . "Index"  
                              FROM  "Сотрудники1"  A33 
                              WHERE ( "A33" . "LinkDetail" = "A32JT2" . "DocID" ) AND 
                                    ( "A33" . "Сотрудник" = 9 ))))) AND
      ( "A39" . "Deleted" = 0 ) 
ORDER BY  "A39" . "DocID"  DESC;



Код: 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.
Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 148  Card= 1  Bytes= 7 )
    1      0    SORT (AGGREGATE)
    2      1      FILTER
    3      2        TABLE ACCESS (FULL) OF 'Накладная1' (Cost= 148  Card= 499 
           3  Bytes= 34951 )

    4      2        FILTER
    5      4          NESTED LOOPS (OUTER)
    6      5            NESTED LOOPS (OUTER) (Cost= 11  Card= 7  Bytes= 168 )
    7      6              MERGE JOIN (CARTESIAN) (Cost= 4  Card= 7  Bytes= 112 )
    8      7                TABLE ACCESS (FULL) OF 'Сотрудники1' (Cost= 1  C
          ard= 1  Bytes= 6 )

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

   11     10                    INDEX (RANGE SCAN) OF 'SYS_C0038090' (UNIQ
          UE) (Cost= 2  Card= 7 )

   12      6              TABLE ACCESS (BY INDEX ROWID) OF 'Товар1' (Cost=
           1  Card= 50060  Bytes= 400480 )

   13     12                INDEX (UNIQUE SCAN) OF 'SYS_C0038063' (UNIQUE)
   14      5            INDEX (UNIQUE SCAN) OF 'SYS_C0038039' (UNIQUE)
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064209
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так был же выше уже переписан. Вы что не все постинги в топике читаете?
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064212
mms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mms
Гость
to Andy

Написав запрос я использовал ваш второй оракловый вариант запроса, который работал 5мин.

Я немного ошибся. Чтобы соответствовал этому второму запросу с exist надо в моем расставить скобочки:

Код: 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. Кто быстрее?
    #32064216
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2.dba

Где???
Тот запрос, что написал ora600 вообще не работает - сервер впадает в тяжелый ступор.

Укажите, пожалйста, где этот запрос? может я что проглядел? :(
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064224
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это было на один постинг выше чем запроc ORA600, тот который повторил сейчас mms. Единственное с чем я несогласен это то что скобки тут будут хоть на что-то влиять - тут везде AND, а значит порядок операций не сущесвенен.
А как все-таки со статистикой? Когда она собиралась?
И почему в ms запросе на одно условие больше?
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064236
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На одно условие больше - так это просто copy/paste виноват. В реальных тестах этого условия нет.

НО ВОТ ОН ЗАПРОС! Работает _ВСЕГО_ 2 секунды:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT 
  Count(*)
FROM  "Накладная1"  A39
WHERE  "A39" . "DocID"  IN (SELECT  DISTINCT
                           "A40" . "LinkDetail" 
                        FROM  "Товары3"  A40,  "Товар1"  A35JT1,  "ЮрЛицо1"  A32JT2,  "Сотрудники1"  A33
                        WHERE ( "A32JT2" . "DocID" (+)= "A33" . "LinkDetail" ) AND
                              ( "A35JT1" . "Производитель" (+)= "A32JT2" . "DocID" ) AND
                              ( "A40" . "Товар" (+)= "A35JT1" . "DocID" ) AND
                              ( "A33" . "Сотрудник" = 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.
  COUNT(*)
 ----------
 
      22070 


Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 2390  Card= 1  Bytes= 18 
          )

    1      0    SORT (AGGREGATE)
    2      1      NESTED LOOPS (Cost= 2390  Card= 27161  Bytes= 488898 )
    3      2        VIEW OF 'VW_NSO_1' (Cost= 2390  Card= 27161  Bytes= 353093 )
    4      3          SORT (UNIQUE) (Cost= 2390  Card= 27161  Bytes= 733347 )
    5      4            HASH JOIN (OUTER) (Cost= 1965  Card= 27161  Bytes= 7333 
           47 )

    6      5              NESTED LOOPS (OUTER) (Cost= 81  Card= 2275  Bytes= 38 
           675 )

    7      6                NESTED LOOPS (OUTER) (Cost= 1  Card= 1  Bytes= 9 )
    8      7                  TABLE ACCESS (FULL) OF 'Сотрудники1' (Cost= 1 
           Card= 1  Bytes= 6 )

    9      7                  INDEX (UNIQUE SCAN) OF 'SYS_C0038039' (UNIQU
          E)

   10      6                TABLE ACCESS (FULL) OF 'Товар1' (Cost= 80  Card=
           50060  Bytes= 400480 )

   11      5              TABLE ACCESS (FULL) OF 'Товары3' (Cost= 379  Card=
           554190  Bytes= 5541900 )

   12      2        INDEX (UNIQUE SCAN) OF 'SYS_C0038082' (UNIQUE)



Но хочется продолжить обсуждения и добиться более значительного превосходства над MS :))
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064238
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставьте инициализационный параметр
optimizer_index_cost_adj = 1
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064239
mms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mms
Гость
Плюсики из запроса убери будет по быстрее :)
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064240
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Плюсики из запроса убери будет по быстрее :)

так, а если человеку принципиально нужны outer join, то тогда что?
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064241
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2.dba
Сорри за глупый вопрос, но где же поставить этот самый параметр? (optimizer_index_cost_adj = 1)
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064243
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL> alter session set optimizer_index_cost_adj = 1;

но это только на уровне сессии (в которой будешь выполнять запрос) - чтоб попробовать. А если понравится :-), то надо отредактировать файл init<SID>.ora и перестартовать базу.
...
Рейтинг: 0 / 0
Oracle or MSSQL 2000. Кто быстрее?
    #32064245
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спаибо все ОГРОМНОЕ!
Теперь я вижу, Oracle действительно выполняет этот запрос быстрее :) в 3 раза!

Еще раз спасибо всем :)
...
Рейтинг: 0 / 0
16 сообщений из 41, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle or MSSQL 2000. Кто быстрее?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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