|
|
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
Вот такая ботва: создаю таблички, заполняю, создаю индексы, собираю статистику. create table emp (id number(10), name varchar2(50), birthday date); begin for i in 1..300000 loop insert into emp values (i,'emp' || i, sysdate - 365*40-1/i); end loop; end; / create unique index pk_emp on emp(id); create index emp_idx1 on emp(name); analyze table emp compute statistics; create table orders (id number(10), id_emp number(10), id_goods number(10)); begin for i in 10..1000000 loop insert into orders values (i, floor(i/10), 5); end loop; end; / create unique index pk_orders on orders(id); create index orders_idx1 on orders(id_emp, id_goods); analyze table orders compute statistics; выполняю запос SQL> select name, orders.id_goods 2 from emp, orders 3 where emp.ID = orders.ID_EMP 4 and emp.id > 1000; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=980 Card=990001 Bytes=18810019) 1 0 HASH JOIN (Cost=980 Card=990001 Bytes=18810019) 2 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=116 Card=299001 Bytes=3887013) 3 1 TABLE ACCESS (FULL) OF 'ORDERS' (Cost=243 Card=990001 Bytes=5940006) SQL> select /*+ FIRST_ROWS */ name, orders.id_goods 2 from emp, orders 3 where emp.ID = orders.ID_EMP 4 and emp.id > 1000; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=30077 Card=990001 Bytes=18810019) 1 0 NESTED LOOPS (Cost=30077 Card=990001 Bytes=18810019) 2 1 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (Cost=177 Card=299001 Bytes=3887013) 3 2 INDEX (RANGE SCAN) OF 'PK_EMP' (UNIQUE) (Cost=625 Card=299001) 4 1 INDEX (RANGE SCAN) OF 'ORDERS_IDX1' (NON-UNIQUE) (Cost=1 Card=3 Bytes=18) Я конечно не против фул скана, но только если это действительно оправдано!! А здесь - первый запрос отрабатывает 18 сек, а второй 0.02 секунды. Есть разница. Помогает также убитие статистики, тогда CHOOSE тоже не делает фул скан. Есть подозрение, что с настройками параметров не все в порядке, однако optimizer_index_caching = 95 и otimizer_index_cost_adj = 10. Статью на сайте уважаемого killed'а я тоже читал. Как думаете, как заставить CHOOSE выбрать другой план выполнения?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 19:26 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
дык я хочу чтоб оно без хинта нормально работало! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 19:37 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
Я пока не поставил otimizer_index_cost_adj=1 CBO тоже нормально не работал. И какой у тебя стоит hash_area_size? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 19:38 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
otimizer_index_cost_adj=1 это ж минимум как я понимаю? hash_area_size = 2048000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 19:46 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
Dlia analiza situacii, esli vogmogno, 2 parametra basi: db_block_size i db_multiblock_read_count a takge esli izvestno -- max IO buffer dlia operaciy chtenia s diska. (naibolee veroiatno 64k) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 19:51 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
>hash_area_size = 2048000 Ну по мне так это слишком. Ни разу не видел, чтоб hash_join работал быстрее чем nested loops. Я их вообще запретил :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 19:57 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
>>Ну по мне так это слишком. Ни разу не видел, чтоб hash_join работал >>быстрее чем nested loops. Я их вообще запретил :-) 1. Надеюсь это шутка... hash_join в 80% процентов случав по определению быстрее...другое дело, что до 8i он работал через пень колоду 2. По поводу хинтов. Никакими суперпуперинипараметрами, вы не добъетесь ВСЕГДА желаемого плана....это как грубая ОБЩАЯ подсказка.... хинты - более тонкая подсказка и помогают в большинстве случаев....))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 20:05 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
Optimizator rabotal po zarosu dostatocho logicho: 1) ispolzovanie optimizer_index_caching = 95 -- primeniaetsiy pri ocenke kolichestva fizicheskih chteniy po otnosheniyu k logicheskim: dlia tablici EMP (300000 - 1000) * (1 - 0.95) = 14950 cheniy i s uchetom db_block_size + mutiblock ... poluchaetcia NAPRIMER : db_blocksize = 8K db_multiblock_read_count = 8 (pochty default) avg rowlen = 18..20 (eto ocenka ishodia iz insert into emp values (i,'emp' || i, sysdate - 365*40-1/i)) 64000/20 (grubo) = 2800 rows (ili ~350 na block) za odno chtenie pri Full scan table a vsego cheniy dlia polnogo prosmotra tablici (pri ocenke pctfree - 10) ~ 860 860 < 14950 -- tac chto FST po mneniu optimizatora luchshe dlia tablici ORDER kolichestvo distinct keys (po polu id_emp ) ~ 10% ot obchego kolichestva rows (ili kazdaya 10ya!!!) factor klasterizacii govorit chto rows s odinakovimi keys ravnomerno razmazany po tablice za 1 chenie pri FST garantiruetsia practicheski na 200 % row s nuznim kluchem poskolku: 2800/10 = 280 rows. A soediniat tablyci v pamyati pri FST bistree vsego cherez HASH JOIN. chego i nabludaetsia po rezultatam plana vipolneniya. teper po povodo otimizer_index_cost_adj=1 -- siy parameter V DANNOM SLUCHAE SILOY zastavliaet optimizator dumat cho 99% blockov TREBUEMIH INDEKSOV uge sibyat v db cache i nugen tolko 1% fizichekih cheniy dlia podkacki ostalnoy chacti. namoy vzglid eto uge slishkom. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 20:46 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
2Non >1. Надеюсь это шутка... >hash_join в 80% процентов случав по определению быстрее...другое дело, >что до 8i он работал через пень колоду Вообще-то да, с hash_join я погорячился, но у меня именно был случай, когда hash_join работал медленнее чем nested loops. Просто у меня сильно выраженное OLTP приложение и поэтому в связи с уходом от полных сканирований таблиц к повсеместному индексному сканированию nested loops более эффективны чем hash join. 2ShgGena >A soediniat tablyci v pamyati pri FST bistree vsego cherez HASH JOIN. >chego i nabludaetsia po rezultatam plana vipolneniya. согласен. >teper po povodo otimizer_index_cost_adj=1 -- siy parameter V DANNOM SLUCHAE >SILOY zastavliaet optimizator dumat cho 99% blockov TREBUEMIH INDEKSOV uge >sibyat v db cache i nugen tolko 1% fizichekih cheniy dlia podkacki ostalnoy >chacti. namoy vzglid eto uge slishkom Это вы с optimizer_index_caching перепутали. otimizer_index_cost_adj=1 говорит только о том, что стоимость индексного доступа составляет 1/100 от стоимости full table scan ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 22:27 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
Пардон за врождённый синдром Вестингауза :), но никак не пойму, откуда взялась цифра в 860 чтений таблицы при полном сканировании? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 23:07 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
Eto ne slogno: -- avg razmer zapisi ~ 23 bait ( insert into emp values (i,'emp' || i, sysdate - 365*40-1/i); t.e 1 pole ~ 5, 2 pole ~ 3+5 = 9..10, 3 pole 10 = 23 (hotia po zizny budet ~ 20) ) -- 10% pctfree + 120 bait na block header (hotia skoree vsego menshe) -- db_block_size (dostupniy dlya insert) = 8K - 10% - 120 ~ 7000 -- kolichestvo rows ~ 7200/23 ~ 315 na 1 fiziceskiy block -- obschee kokichestvo rows = 300000 -- 300000 /315 ~ 950 cheniy dlia Full Scan Table. Vinovat v perviy raz vmesto 315 podelil na 350 poskoplku delal ocenku dliy 20 bait = avg razmer zapisi -- 300000 /350 ~ 860 cheniy dlia Full Scan Table. ( no eto malo menyaet logicu optimizatora) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 23:23 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
Da kstati mogno dobait chto optimizator bubet vichsliat cenu FST po formule: KOL-CHTENIY / DB_MULTIBLOCK_READ_COUNT (t.e 860/8 = 107 ili 950/8 = 119 (pokazano 116)) >>> 2 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=116 Card=299001 Bytes=3887013) t.e i ochen ne dolek ot istiny. No posle FTS dlia oboih tablic zapros narivaetsia na HASH_AREA_SIZE = 2MB a tablici imeut 300000 i 1000000 zapisey Dalee vsia eta massa tranziton uezgaet v TEMP tablespace. MULTIBLOCK_READ_COUNT dlia temp egeli ee ne trogat = 2 pust extent size dlia TEMP Tablespace = 1M (v chem i licho somnevaus, eto nado proveriat) i kak rezultat swaping megdu HASH_AREA i TEMP tablespace. poetomu 18 sek - vremia vipolneniya zaprosa. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2003, 23:43 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
забыл сказать, у меня 9.2 соответственно табличное пространство localy managed и SEGMENT SPACE MANAGEMENT AUTO. Теперь про параметры: db_block_size = 8192 db_file_multiblock_read_count = 16 у TEMP - UNIFORM SIZE 1024K avg Row len для emp - 26 для orders - 16 подскажите как узнать max IO buffer для операций чтения с диска. 2 non: Не хочу я хинты использовать... 2 ShgGena: Т.е. мне поможет увеличение hash_area_size ? Но до каких размеров? Если я правильно посчитал обе таблицы весят около 30М эдак никакой памяти не хватит.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2003, 10:17 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
2Gena: Спасибо за объяснение. Но вот мой клинический случай: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Почему так? Между прочим, оптимизатор здесь прав - время выполнения хинтованного запроса примерно в 1,8 раза больше, чем нехинтованного. Ещё интересно, что за железо у Um'а такое, что выборка ~990 тысяч строк проходит за 0,02 сек? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2003, 10:57 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
2 Scott Tiger: а какой размер hash_area_size? и за какое время выолняется хинтованый и не хинтованый запрос? Оптимизатор понятное дело прав, только надо под его правоту еще параметры подогнать :-)) А железо разное есть, есть тачка с обычным винтом на 20Гб Виндами камнем 1ГГц памятью 512М, а есть Sun двухпроцессорный со сказевыми винтами и гигабайтом памяти, ессно с соляркой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2003, 11:15 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
2Мб 2м 55с и 1м 44с - ну это 350Мгц AMD K6-2 с 384 Мб и IDE :) в домашних условиях под солярой. Но я почему-то не верю про 0.02 сек на 980 тысяч записей. Разве что первая строка за такое время отдаётся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2003, 11:52 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
Вроде разобрался. Спасибо всем принявшим участие и ткнувшим носом :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2003, 13:08 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
Nekotorie otvety na voproci (chgo mogu) 1) >>подскажите как узнать max IO buffer для операций чтения с диска. dlia window - ne znau dlia solaris --> konfiguracionniy file /etc/system imya parametra => maxphys (v principe ego mozno smelo uvelichvat do 1 MB (by default = 64K) tolko on zadaetcya v baytah Linux --> imia analogichoe, no i bi opasalsia davat razmer maxphys bolshe 256K 2) Т.е. мне поможет увеличение hash_area_size ? Но до каких размеров? Если я правильно посчитал обе таблицы весят около 30М эдак никакой памяти не хватит Otvet DA, no sovershenno neobiazatelno eto delat dlia vsey bazi. mogno ispolzovat alter session ALTER SESSION SET HASH_AREA_SYZE=3000000... (skolko nado) ... obrabotka ALTER SESSION SET HASH_AREA_SYZE=( vernut obratno, poskolku zakon - za soboy nado podmetat ) 3) у TEMP - UNIFORM SIZE 1024K na moy vzglyad malovato. kak pravilo esli narvalsya na temp operacii - ne zaley resurcov (deshevle viydet) I by ustanovil = 5..10* max(sort_area_size,hash_area_size) 4) 2 dba -- Это вы с optimizer_index_caching перепутали. otimizer_index_cost_adj=1 говорит только о том, что стоимость индексного доступа составляет 1/100 от стоимости full table scan soglasen lohanulsia 5) o vremeni vitolneniya 18 s -- 0.02 s >>> Ещё интересно, что за железо у Um'а такое, что выборка ~990 тысяч строк проходит за 0,02 сек? I ishodil is sleduyuschego: -- soliyarka imeet 1GB pamiaty pri 30% bufferniy kesh te ~ 300MB -- nastriyka razmerov holodnoy i goriachey polovin kesha ne provodilas (t.e. 50x50) -- obshiy razmer viborky dlia 2 tbl ~ 30MB ili 20% holodnoy poloviny rezultat => k momentu nachala vipolneniya 2-go zaprosa 100% blokov tablic uge sideli v holodnoy polovine i vremia vitolneniya 0.02 smotritsia kak vpolne realnoe. poka vse. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2003, 21:11 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
2ShgGena Код: plaintext 1. 2. 3. 4. 5. Имелся ввиду кэш операшки (=Соляриса) или Оракуловский? Если соляркин, то можно ссылочку, как их настраивать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2003, 03:11 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
если еще не слишком поздно к дискуссии... 1) >>подскажите как узнать max IO buffer для операций чтения с диска. >dlia window - ne znau на NTFS я подозреваю это будет размер кластера >dlia solaris --> konfiguracionniy file /etc/system imya parametra => maxphys (v principe ego mozno smelo uvelichvat do 1 MB (by default = 64K) tolko on zadaetcya v baytah опять же, это если raw devices. Для ufs если память не изменяет размер буфера 8К. ОС будет бить мультиблочные операции побуферно. >Linux --> imia analogichoe, no i bi opasalsia davat razmer maxphys bolshe 256K Интересно, где он прописывается под Линукс? Думаю, что без пересборки ядра тут не обойтись. Интересно также в чем опасения? >5) o vremeni vitolneniya 18 s -- 0.02 s >>> Ещё интересно, что за железо у Um'а такое, что выборка ~990 тысяч строк проходит за 0,02 сек? >I ishodil is sleduyuschego: >-- soliyarka imeet 1GB pamiaty pri 30% bufferniy kesh te ~ 300MB >-- nastriyka razmerov holodnoy i goriachey polovin kesha ne provodilas (t.e. 50x50) При FTS используется лишь несколько блоков (подозреваю, что db_file_mutliblock_read_count но не уверен) с холодного конца кэша, которые переиспользуются в течение операции. Иначе кэш будет сильно размываться. >-- obshiy razmer viborky dlia 2 tbl ~ 30MB ili 20% holodnoy poloviny rezultat => k momentu nachala vipolneniya 2-go zaprosa 100% blokov tablic uge sideli v holodnoy polovine >i vremia vitolneniya 0.02 smotritsia kak vpolne realnoe. Это скорее из-за /*+ FIRST_ROWS */ - время получения первой записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2003, 02:53 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
>Имелся ввиду кэш операшки (=Соляриса) или Оракуловский? Если соляркин, то можно ссылочку, как их настраивать? хм, я так понял, что речь шла про оракловый кэш. Если иначе - мои извинения. Кое-что можно выцепить в статье Гаджи про рэйд на oradba.com.ru Насколько я знаю, способа ограничить размер кэша файловой системы нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2003, 02:59 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
>>>>При FTS используется лишь несколько блоков (подозреваю, что db_file_mutliblock_read_count но не уверен) с холодного конца кэша, которые переиспользуются в течение операции. Иначе кэш будет сильно размываться. Для FTS используется не несколько блоков а ровно 20% хвоста холодной части кеша, но не менее 4 блоков. В случае создания recycle db cache все блоки при FTP уедут туда если он имеет достаточный размер. По настройке кеша. Я говорил об Oracle db cache . >>> Насколько я знаю, способа ограничить размер кэша файловой системы нет. Для Solaris начиная с 2.1 максимальный размер файлового кеша устанавливается в килобайтах параметром: set bufhwt=xxxxx в /etc/system (HWM для файлового кеша) Кроме того можно установить размер страницы приращения кеша но не более HWT для него : set p_nbpuf = xxx --> количество распределяемых буферов файлового кеша set nbuf = xxx --> размер каждого буфера в байтах. >>> Для ufs если память не изменяет размер буфера 8К. ОС будет бить мультиблочные операции побуферно. Опять только для солярки --> баг № 433762 ??? (насколько помню) начиная с 7.2 ( или 7.3 не вспомню ...) при установке параметра max_IO_size Oracle может использовать до 1МБ для db_multiblock_read_count (те. 128 блоков при 8К блоке) при условии установки maxphys Дополнительно если прменять Veritas VM то размер регулируется /etc/system : set vxio:vol_maxio=xxx (количество блоков по 512 байт - сектор диска) максимум (не уверен в этом) = также 1 МБ >> Это скорее из-за /*+ FIRST_ROWS */ - время получения первой записи если Um применял --> set autotrace trace only и set timing on для оценки времени выполнения, то timing должен показать общее время выполнения а не время до получения первой записи (при условии что время вывода записей на экран и время передачи данных по сетке не учитывается) если он использовал секундомер - то время показывает все что угодно, но не выполнение запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2003, 10:02 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
>Для FTS используется не несколько блоков а ровно 20% хвоста холодной части кеша, но не менее 4 блоков. Откуда эта информация? Ссылка есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2003, 16:40 |
|
||
|
Вопрос про СВО.
|
|||
|---|---|---|---|
|
#18+
Какая-то из статей на orapub.com примерно 2 года назад. Она описывала детати touch алгоритма работы с кешем и по формулам можно было просчитать размеры областей. Найду у себя в папках сообщу (но не раньше понедельника - папки на работе). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2003, 18:16 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32095608&tid=1992046]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
267ms |
get topic data: |
7ms |
get forum data: |
6ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 584ms |

| 0 / 0 |
