Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос про СВО. / 25 сообщений из 28, страница 1 из 2
23.01.2003, 19:26
    #32095530
Um
Um
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
Вот такая ботва:
создаю таблички, заполняю, создаю индексы, собираю статистику.

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 выбрать другой план выполнения??
...
Рейтинг: 0 / 0
23.01.2003, 19:33
    #32095535
non
non
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
cм. hint
...
Рейтинг: 0 / 0
23.01.2003, 19:37
    #32095538
Um
Um
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
дык я хочу чтоб оно без хинта нормально работало!
...
Рейтинг: 0 / 0
23.01.2003, 19:38
    #32095539
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
Я пока не поставил otimizer_index_cost_adj=1 CBO тоже нормально не работал. И какой у тебя стоит hash_area_size?
...
Рейтинг: 0 / 0
23.01.2003, 19:46
    #32095542
Um
Um
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
otimizer_index_cost_adj=1 это ж минимум как я понимаю?
hash_area_size = 2048000
...
Рейтинг: 0 / 0
23.01.2003, 19:51
    #32095546
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
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)
...
Рейтинг: 0 / 0
23.01.2003, 19:57
    #32095549
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
>hash_area_size = 2048000

Ну по мне так это слишком. Ни разу не видел, чтоб hash_join работал быстрее чем nested loops. Я их вообще запретил :-)
...
Рейтинг: 0 / 0
23.01.2003, 20:05
    #32095551
non
non
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
>>Ну по мне так это слишком. Ни разу не видел, чтоб hash_join работал >>быстрее чем nested loops. Я их вообще запретил :-)

1. Надеюсь это шутка...
hash_join в 80% процентов случав по определению быстрее...другое дело, что до 8i он работал через пень колоду

2. По поводу хинтов.
Никакими суперпуперинипараметрами, вы не добъетесь ВСЕГДА желаемого плана....это как грубая ОБЩАЯ подсказка....
хинты - более тонкая подсказка и помогают в большинстве случаев....)))
...
Рейтинг: 0 / 0
23.01.2003, 20:46
    #32095576
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
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.
...
Рейтинг: 0 / 0
23.01.2003, 22:27
    #32095600
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
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
...
Рейтинг: 0 / 0
23.01.2003, 23:07
    #32095603
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
Пардон за врождённый синдром Вестингауза :), но никак не пойму, откуда взялась цифра в 860 чтений таблицы при полном сканировании?
...
Рейтинг: 0 / 0
23.01.2003, 23:23
    #32095605
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
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)
...
Рейтинг: 0 / 0
23.01.2003, 23:43
    #32095608
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
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.
...
Рейтинг: 0 / 0
24.01.2003, 10:17
    #32095701
Um
Um
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
забыл сказать, у меня 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М эдак никакой памяти не хватит..
...
Рейтинг: 0 / 0
24.01.2003, 10:57
    #32095727
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
2Gena: Спасибо за объяснение.
Но вот мой клинический случай:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
db_block_size =  8192 
db_file_multiblock_read_count =  4 
optimizer_index_caching = default ( 0 )
optimizer_index_cost_adj = default ( 100 )
pctfree для блоков этих таблиц =  10 %

Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 344  Card= 30004750  Bytes= 1170185250 )
    1      0    HASH JOIN (Cost= 344  Card= 30004750  Bytes= 1170185250 )
    2      1      INDEX (RANGE SCAN) OF 'ORDERS_IDX1' (NON-UNIQUE) (Cost= 2  Card= 10035  Bytes= 260910 )
    3      1      TABLE ACCESS (FULL) OF 'EMP' (Cost= 274  Card= 299001  Bytes= 3887013 )


Почему так?
Между прочим, оптимизатор здесь прав - время выполнения хинтованного запроса примерно в 1,8 раза больше, чем нехинтованного.

Ещё интересно, что за железо у Um'а такое, что выборка ~990 тысяч строк проходит за 0,02 сек? :)
...
Рейтинг: 0 / 0
24.01.2003, 11:15
    #32095753
Um
Um
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
2 Scott Tiger:
а какой размер hash_area_size?
и за какое время выолняется хинтованый и не хинтованый запрос?
Оптимизатор понятное дело прав, только надо под его правоту еще параметры подогнать :-))
А железо разное есть, есть тачка с обычным винтом на 20Гб Виндами камнем 1ГГц памятью 512М, а есть Sun двухпроцессорный со сказевыми винтами и гигабайтом памяти, ессно с соляркой.
...
Рейтинг: 0 / 0
24.01.2003, 11:52
    #32095789
Scott Tiger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
2Мб
2м 55с и 1м 44с - ну это 350Мгц AMD K6-2 с 384 Мб и IDE :) в домашних условиях под солярой. Но я почему-то не верю про 0.02 сек на 980 тысяч записей. Разве что первая строка за такое время отдаётся.
...
Рейтинг: 0 / 0
24.01.2003, 13:08
    #32095863
Um
Um
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
Вроде разобрался.
Спасибо всем принявшим участие и ткнувшим носом :))
...
Рейтинг: 0 / 0
24.01.2003, 21:11
    #32096248
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
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.
...
Рейтинг: 0 / 0
25.01.2003, 03:11
    #32096282
vskv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
2ShgGena
Код: plaintext
1.
2.
3.
4.
5.
И исходил из следующего:
 -- солярка имеет 1Гб памяти при 30% буферном кэше. Т.е. ~ 300MB 
 
 -- настройка размеров холодной и горячей половин кэша не проводилась (т.е. 50х50)
 
...


Имелся ввиду кэш операшки (=Соляриса) или Оракуловский?
Если соляркин, то можно ссылочку, как их настраивать?
...
Рейтинг: 0 / 0
26.01.2003, 02:53
    #32096383
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
если еще не слишком поздно к дискуссии...

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 */ - время получения первой записи
...
Рейтинг: 0 / 0
26.01.2003, 02:59
    #32096385
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
>Имелся ввиду кэш операшки (=Соляриса) или Оракуловский?
Если соляркин, то можно ссылочку, как их настраивать?

хм, я так понял, что речь шла про оракловый кэш. Если иначе - мои извинения.

Кое-что можно выцепить в статье Гаджи про рэйд на oradba.com.ru

Насколько я знаю, способа ограничить размер кэша файловой системы нет.
...
Рейтинг: 0 / 0
26.01.2003, 10:02
    #32096404
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
>>>>При 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 должен показать общее время выполнения а не время до получения первой записи
(при условии что время вывода записей на экран и время передачи данных по сетке не учитывается)

если он использовал секундомер - то время показывает все что угодно, но не выполнение запроса.
...
Рейтинг: 0 / 0
26.01.2003, 16:40
    #32096438
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
>Для FTS используется не несколько блоков а ровно 20% хвоста холодной части кеша, но не менее 4 блоков.

Откуда эта информация? Ссылка есть?
...
Рейтинг: 0 / 0
26.01.2003, 18:16
    #32096450
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про СВО.
Какая-то из статей на orapub.com примерно 2 года назад. Она описывала детати touch алгоритма работы с кешем и по формулам можно было просчитать размеры областей.
Найду у себя в папках сообщу (но не раньше понедельника - папки на работе).
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос про СВО. / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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