SQL.RU
 client/server technologies
 
 Главная | Документация | Статьи | Книги | Форум | Опросы | Рассылка | Работа | Поиск | FAQ |

Добро пожаловать в форум, Guest  >>  Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик  Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 CBO и временные таблицы   [new]
Майор
Guest
Итак ситуация:
во временную оракловую таблицу пишется промежуточный результат ProductId. Результат может быть одной записью или несколько тысяч записей. На следующим шаге эта табличка участвует в многотабличном соединении. Соответственно NL выгоден для небольшого количества записей, и HJ для для большого. Статистики для временной таблицы само собой нет и CBO использует для первого соединения с этой таблицей HJ, а для всех последующих NL. Это в большинстве случаев работает прекрасно, но для большого количества записей NL конкретно гасят производительность. Использовать хинт use_hash или use_nl в зависимости от количества записей во временной таблице, мне представляется уж как то сильно прямолинейным, есть ли какой-либо другой фокус?
20 июл 04, 10:13    [819570] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Alexander Dubrovsky
Member [заблокирован]

Откуда:
Сообщений: 4625
Майор
Итак ситуация:
во временную оракловую таблицу пишется промежуточный результат ProductId. Результат может быть одной записью или несколько тысяч записей. На следующим шаге эта табличка участвует в многотабличном соединении. Соответственно NL выгоден для небольшого количества записей, и HJ для для большого. Статистики для временной таблицы само собой нет и CBO использует для первого соединения с этой таблицей HJ, а для всех последующих NL. Это в большинстве случаев работает прекрасно, но для большого количества записей NL конкретно гасят производительность. Использовать хинт use_hash или use_nl в зависимости от количества записей во временной таблице, мне представляется уж как то сильно прямолинейным, есть ли какой-либо другой фокус?


Я бы просто поставил /*+RULE*/ в данном случае, ибо оптимизатор тут так тупит, а собирать статистику по временной таблице вроде как глупо... или нет?
Если даже у тебя будет запрос из 20 таблиц и статистика будет собрана только по одной, то включится CBO и несложно предположить чего он там себе преположит...
20 июл 04, 10:25    [819627] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
softwarer
Member

Откуда: Москва
Сообщений: 24460
Майор
Соответственно NL выгоден для небольшого количества записей, и HJ для для большого.

У Кайта показано как раз для случая временных таблиц, как подсунуть CBO нужную статистику. Как правило нетрудно узнать, сколько же строк во временной таблице (которая заполняется тобой же - достаточно просуммировать все %rowcount). Я бы попробовал действовать в этом ключе.
20 июл 04, 10:33    [819657] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Майор
Guest
softwarer
Майор
Соответственно NL выгоден для небольшого количества записей, и HJ для для большого.

У Кайта показано как раз для случая временных таблиц, как подсунуть CBO нужную статистику. Как правило нетрудно узнать, сколько же строк во временной таблице (которая заполняется тобой же - достаточно просуммировать все %rowcount). Я бы попробовал действовать в этом ключе.

Ага точно, нашел. Большое спасибо за новодку.
20 июл 04, 10:43    [819687] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Alexander Dubrovsky
Member [заблокирован]

Откуда:
Сообщений: 4625
softwarer
Майор
Соответственно NL выгоден для небольшого количества записей, и HJ для для большого.

У Кайта показано как раз для случая временных таблиц, как подсунуть CBO нужную статистику. Как правило нетрудно узнать, сколько же строк во временной таблице (которая заполняется тобой же - достаточно просуммировать все %rowcount). Я бы попробовал действовать в этом ключе.

А что, ЦБО уж настолько эффективней, что стоит ему даже для временных таблиц статистику подсовывать изощряться?
20 июл 04, 10:55    [819732] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
softwarer
Member

Откуда: Москва
Сообщений: 24460
Alexander Dubrovsky
А что, ЦБО уж настолько эффективней, что стоит ему даже для временных таблиц статистику подсовывать изощряться?

1. Полагаю, это зависит от количества записей во временных таблицах.
2. Бывает, что временные таблицы приходится join-ить с постоянными.
20 июл 04, 10:57    [819743] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 8314
2 Alexander Dubrovsky

RBO не поддерживает фичи 8i. Их много, хороших и разных.
20 июл 04, 11:02    [819767] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
softwarer
Member

Откуда: Москва
Сообщений: 24460
Gluk (Kazan)
RBO не поддерживает фичи 8i. Их много, хороших и разных.

Кстати, у меня есть гнусное подозрение, что это маркетинговый ход - дабы люди активнее переходили на CBO. В результате граница, после которой использование RBO оказывается невозможным, оказывается заметно ниже.
20 июл 04, 11:07    [819786] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1511
Alexander Dubrovsky
А что, ЦБО уж настолько эффективней, что стоит ему даже для временных таблиц статистику подсовывать изощряться?

Для 10g может не потребоваться даже подсовывать статистику,
работает DYNAMIC_SAMPLING ( в 9-ке тоже есть, но проверить не могу).

Смотрим:
Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining options

SQL> select value from V$parameter where name = 'optimizer_dynamic_sampling';

VALUE
--------------------------------------------------------------------------------

2 SQL> drop table test purge; Table dropped. SQL> create table test ( id, name ) as select object_id, object_name from all_objects; Table created. SQL> create unique index test_i on test( id); Index created. SQL> analyze table test compute statistics; Table analyzed. SQL> create global temporary table test_tmp ( id number(10)); Table created. SQL> select count(*) from test; COUNT(*) ----------
40299 SQL> insert into test_tmp select id from test where mod(id,2)=0 and rownum <= 5000; 5000 rows created. SQL> set autotrace traceonly exp; SQL> select name from test, test_tmp where test.id=test_tmp.id; Execution Plan ----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=53 Card=5000 Bytes =210000) 1 0 HASH JOIN (Cost=53 Card=5000 Bytes=210000) 2 1 TABLE ACCESS (FULL) OF 'TEST_TMP' (TABLE (TEMP)) (Cost=4 Card=5000 Bytes=65000) 3 1 TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=48 Card=4029 9 Bytes=1168671) SQL> rollback; Rollback complete. SQL> insert into test_tmp select id from test where mod(id,2)=0 and rownum <= 5; 5 rows created. SQL> select name from test, test_tmp where test.id=test_tmp.id; Execution Plan ----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=5 Bytes=210 ) 1 0 NESTED LOOPS (Cost=7 Card=5 Bytes=210) 2 1 TABLE ACCESS (FULL) OF 'TEST_TMP' (TABLE (TEMP)) (Cost=2 Card=5 Bytes=65) 3 1 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (TABLE) (Cost=1 Card=1 Bytes=29) 4 3 INDEX (UNIQUE SCAN) OF 'TEST_I' (INDEX (UNIQUE)) (Cost =0 Card=1) -- план поменялся для 5 записей имеем NESTED LOOPS
SQL> rollback; Rollback complete. SQL> set autotrace off; -- отключаю dynamic_sampling
SQL> alter session set optimizer_dynamic_sampling = 0; Session altered. SQL> insert into test_tmp select id from test where mod(id,2)=0 and rownum <= 5000; 5000 rows created. SQL> set autotrace traceonly exp; SQL> select name from test, test_tmp where test.id=test_tmp.id; Execution Plan ----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=73 Card=8168 Bytes =343056) 1 0 HASH JOIN (Cost=73 Card=8168 Bytes=343056) 2 1 TABLE ACCESS (FULL) OF 'TEST_TMP' (TABLE (TEMP)) (Cost=2 4 Card=8168 Bytes=106184) 3 1 TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=48 Card=4029 9 Bytes=1168671) SQL> rollback; Rollback complete. SQL> insert into test_tmp select id from test where mod(id,2)=0 and rownum <= 5; 5 rows created. SQL> select name from test, test_tmp where test.id=test_tmp.id; Execution Plan ----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=73 Card=8168 Bytes =343056) 1 0 HASH JOIN (Cost=73 Card=8168 Bytes=343056) 2 1 TABLE ACCESS (FULL) OF 'TEST_TMP' (TABLE (TEMP)) (Cost=2 4 Card=8168 Bytes=106184) 3 1 TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=48 Card=4029 9 Bytes=1168671) -- план тот же , что и для 5000 записей
SQL> rollback; Rollback complete. SQL> set autotrace off; SQL> select value from V$parameter where name = 'optimizer_dynamic_sampling'; VALUE --------------------------------------------------------------------------------
0
20 июл 04, 11:10    [819797] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Майор
Guest
Я и ёжик
...
В 9.2 не пашеть нестедь луп... Но пашеть с таким хинтом :-)
select /*+ dynamic_sampling(test_tmp 1) */ name from test, test_tmp where test.id=test_tmp.id;
Ещё более огромное спасибо тебе и ежику.
20 июл 04, 11:37    [819924] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1511
Майор
В 9.2 не пашеть нестедь луп... Но пашеть с таким хинтом :-)
select /*+ dynamic_sampling(test_tmp 1) */ name from test, test_tmp where test.id=test_tmp.id;


Может там по умолчанию dynamic sampling выключен? Проверте значение параметра optimizer_dynamic_sampling.
20 июл 04, 11:43    [819952] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Майор
Guest
Я и ёжик
Майор
В 9.2 не пашеть нестедь луп... Но пашеть с таким хинтом :-)
select /*+ dynamic_sampling(test_tmp 1) */ name from test, test_tmp where test.id=test_tmp.id;


Может там по умолчанию dynamic sampling выключен? Проверте значение параметра optimizer_dynamic_sampling.

По умолчанию одын. И это вообщем то правильно.
Вот чего Оракл пишет:
The sampling levels are as follows if the dynamic sampling level used is from a
cursor hint or from the optimizer_dynamic_sampling parameter:
n Level 0: Do not use dynamic sampling.
n Level 1: Sample all tables that have not been analyzed if the following criteria
are met: (1) there is at least 1 unanalyzed table in the query; (2) this unanalyzed
table is joined to another table or appears in a subquery or non-mergeable view;
(3) this unanalyzed table has no indexes; (4) this unanalyzed table has more
blocks than the number of blocks that would be used for dynamic sampling of
this table. The number of blocks sampled is the default number of dynamic
sampling blocks (32).
n Level 2: Apply dynamic sampling to all unanalyzed tables. The number of
blocks sampled is the default number of dynamic sampling blocks.
n Level 3: Apply dynamic sampling to all tables that meet Level 2 criteria, plus all
tables for which standard selectivity estimation used a guess for some predicate
that is a potential dynamic sampling predicate. The number of blocks sampled
is the default number of dynamic sampling blocks.
n Level 4: Apply dynamic sampling to all tables that meet Level 3 criteria, plus all
tables that have single-table predicates that reference 2 or more columns. The
number of blocks sampled is the default number of dynamic sampling blocks.
n Level 5: Apply dynamic sampling to all tables that meet the Level 4 criteria
using 2 times the default number of dynamic sampling blocks.
n Level 6: Apply dynamic sampling to all tables that meet the Level 5 criteria
using 4 times the default number of dynamic sampling blocks.
n Level 7: Apply dynamic sampling to all tables that meet the Level 6 criteria
using 8 times the default number of dynamic sampling blocks.
Level 8: Apply dynamic sampling to all tables that meet the Level 7 criteria
using 32 times the default number of dynamic sampling blocks.
n Level 9: Apply dynamic sampling to all tables that meet the Level 8 criteria
using 128 times the default number of dynamic sampling blocks.
n Level 10: Apply dynamic sampling to all tables that meet the Level 9 criteria
using all blocks in the table.
20 июл 04, 11:49    [819987] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1511
А OPTIMIZER_FEATURES_ENABLE какое значение имеет?
20 июл 04, 12:01    [820046] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Майор
Guest
Я и ёжик
А OPTIMIZER_FEATURES_ENABLE какое значение имеет?

9.2.0.1
20 июл 04, 12:15    [820127] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1511
1) При optimizer_dynamic_sampling=1 10g в данном примере ведет себя так же как и 9.2 у Вас, там просто по умолчанию optimizer_dynamic_sampling=2.

2) Выгоднее может оказатся всё таки подсунуть серверу статистику, а не заставлять его делать дополнительные действия .
20 июл 04, 15:42    [821202] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Fucker
Member

Откуда:
Сообщений: 1527
Alexander Dubrovsky
softwarer
Майор
Соответственно NL выгоден для небольшого количества записей, и HJ для для большого.

У Кайта показано как раз для случая временных таблиц, как подсунуть CBO нужную статистику. Как правило нетрудно узнать, сколько же строк во временной таблице (которая заполняется тобой же - достаточно просуммировать все %rowcount). Я бы попробовал действовать в этом ключе.

А что, ЦБО уж настолько эффективней, что стоит ему даже для временных таблиц статистику подсовывать изощряться?



Во всяком случае он намного эффективнее и логичнее многих присутствующих здесь "человеков". И от версии к версии набирается ума. Если не использовать глюкавые первые релизы, нормально настроена БД и у разработчика прямые руки, CBO ведет себя вполне адекватно.


Есть такая народная мудрость: неча на зеркало пенять, коли рожа крива.
Может быть немного грубо, но верно...



Fucker
20 июл 04, 17:55    [821944] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Alexander Dubrovsky
Member [заблокирован]

Откуда:
Сообщений: 4625
Fucker
Alexander Dubrovsky
softwarer
Майор
Соответственно NL выгоден для небольшого количества записей, и HJ для для большого.

У Кайта показано как раз для случая временных таблиц, как подсунуть CBO нужную статистику. Как правило нетрудно узнать, сколько же строк во временной таблице (которая заполняется тобой же - достаточно просуммировать все %rowcount). Я бы попробовал действовать в этом ключе.

А что, ЦБО уж настолько эффективней, что стоит ему даже для временных таблиц статистику подсовывать изощряться?



Во всяком случае он намного эффективнее и логичнее многих присутствующих здесь "человеков". И от версии к версии набирается ума. Если не использовать глюкавые первые релизы, нормально настроена БД и у разработчика прямые руки, CBO ведет себя вполне адекватно.


Есть такая народная мудрость: неча на зеркало пенять, коли рожа крива.
Может быть немного грубо, но верно...



Fucker


Не надо вырывать из контекста.
Глобально пусть себе трудится ЦБО, но стоит ли ломать копья на статистике к временным таблицам?
Вот о чем я лично говорил, может быть ну его в таком случае и пусть /*+RULE*/ трудится?
20 июл 04, 18:03    [821972] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
killed
Member

Откуда: Moscow
Сообщений: 3431
Alexander Dubrovsky


Не надо вырывать из контекста.
Глобально пусть себе трудится ЦБО, но стоит ли ломать копья на статистике к временным таблицам?
Вот о чем я лично говорил, может быть ну его в таком случае и пусть /*+RULE*/ трудится?


По меньшей мере HJ Майор потеряет в этом случае.
20 июл 04, 21:25    [822383] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Майор
Guest
Я и ёжик
1) При optimizer_dynamic_sampling=1 10g в данном примере ведет себя так же как и 9.2 у Вас, там просто по умолчанию optimizer_dynamic_sampling=2.

2) Выгоднее может оказатся всё таки подсунуть серверу статистику, а не заставлять его делать дополнительные действия .

Ну дык подсунуть то можно, только количество блоков зависит от размера блока, а он у нас в разных базах разный. Хотя количество строк и среднюю длину можно конечно подсунуть и посмотреть. Но лучшее враг хорошего - итак работает всё окей.
Вот правда теоритический вопрос возник:
как себя ведёт этот хинт с аутлайнами? По идее, будет всё время план из аутлайна использовать, тогда этот хинт опять таки мертвому припарка?
21 июл 04, 16:08    [824661] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1511
Майор
как себя ведёт этот хинт с аутлайнами? По идее, будет всё время план из аутлайна использовать, тогда этот хинт опять таки мертвому припарка?

Аутлайны это фича, которую ещё называют "стабилизация плана оптимизатора" (Plan Stability), что противоречит Вашей исходной задаче, Вы же хотели "нестабильный" план. С другой стороны кто мешает Вам в "стабильный" план подсунуть хинт DYNAMIC_SAMPLING? Stored Outline хранит не план запроса, а набор подсказок ( хинтов) , описывающих действия сервера Oracle, который он должен выполнить при выполнении соответствующего SQL-оператора, вот и воткните этот хинт туда-же, будет стабильно "нестабильный" план :). Хотя мне не очень понятно, зачем Вы хотите использовать Stored Outlines.
Стабилизация плана оптимизатора в Oracle 8i/9i Джонатан Льюис, www.jlcomp.demon.co.uk Перевод Валерия Кравчука
21 июл 04, 16:58    [824931] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Майор
Guest
Я и ёжик
Майор
как себя ведёт этот хинт с аутлайнами? По идее, будет всё время план из аутлайна использовать, тогда этот хинт опять таки мертвому припарка?

Аутлайны это фича, которую ещё называют "стабилизация плана оптимизатора" (Plan Stability), что противоречит Вашей исходной задаче, Вы же хотели "нестабильный" план. С другой стороны кто мешает Вам в "стабильный" план подсунуть хинт DYNAMIC_SAMPLING? Stored Outline хранит не план запроса, а набор подсказок ( хинтов) , описывающих действия сервера Oracle, который он должен выполнить при выполнении соответствующего SQL-оператора, вот и воткните этот хинт туда-же, будет стабильно "нестабильный" план :). Хотя мне не очень понятно, зачем Вы хотите использовать Stored Outlines.
Стабилизация плана оптимизатора в Oracle 8i/9i Джонатан Льюис, www.jlcomp.demon.co.uk Перевод Валерия Кравчука

Да не, я не хочу их использовать. Они всё равно для нас неудобные, т.к. часто скл правят, комментарий там например добавят и пошло поехало всё наперекосяк с этими аутлайнами.
Это я к тому спрашиваю, что если ВДРУГ наш админ начитаеться нашего друга Тома и со всей дури нагенерит через триггер он логон отлайнов для всего что у нас есть, то может мне по идее малину всю испортить. Хотя по другой идее, он вроде про нашего друга слыхом не слыхивал, так что может и пронесет лихо мимо.
21 июл 04, 17:32    [825111] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
softwarer
Member

Откуда: Москва
Сообщений: 24460
Майор
Это я к тому спрашиваю, что если ВДРУГ наш админ начитаеться нашего друга Тома и со всей дури нагенерит через триггер

Вспоминается мне история - позвонил нам однажды клиент и сказал, что приложение сломалось нахрен. В итоге выяснилось, что админ начитался уж не знаю кого и в конец каждой stored procedure аккуратно добавил commit.

Мораль - от дурной головы защититься трудно, а если она с паролем sys-а - так и практически невозможно.
21 июл 04, 17:39    [825149] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1511
Майор

что если ВДРУГ наш админ начитаеться нашего друга Тома и со всей дури нагенерит через триггер он логон отлайнов для всего что у нас есть, то может мне по идее малину всю испортить.

Ну выколите ему глазки, чтобы не читал... у Scotta вроде ножичек был...
21 июл 04, 17:55    [825236] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 8314
2 softwarer

Не беспокойте Scott-а, достаточно заврапить весь код и у злого админа не будет возможности вставить в него свои commit-ы, а будет возможность пойти на этот форум и у всех слезно просить UnWrap-ер
22 июл 04, 08:20    [826135] Ответить | Цитировать    Сообщить модератору

 Re: CBO и временные таблицы   [new]
Fucker
Member

Откуда:
Сообщений: 1527
Я и ёжик
Майор

что если ВДРУГ наш админ начитаеться нашего друга Тома и со всей дури нагенерит через триггер он логон отлайнов для всего что у нас есть, то может мне по идее малину всю испортить.

Ну выколите ему глазки, чтобы не читал... у Scotta вроде ножичек был...


Картинка с другого сайта.

Плач слепого админа

Тупым ножом мне выкололи глазки
Чтобы в шкафу я Кайта не нашел
Не вижу монитора я и не админю баз'ки
Зато я нюхаю и слышу хорошо



Fucker
22 июл 04, 15:01    [827729] Ответить | Цитировать    Сообщить модератору

Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить
Generated time: 46ms.
Rambler's Top100 Powered by ActualForum 1.5.3 [s1] Copyright (c) Alex Sibilev 2000-2010