powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каким образом выполяется count(*) и как его можно потимизировать
57 сообщений из 57, показаны все 3 страниц
Каким образом выполяется count(*) и как его можно потимизировать
    #39554351
helgisbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oracle 11.2.0.4.

Сделал по нескольким таблицам несколько запросов "select count(*) from <table_name>" и просмотрел по ним статистику. Выяснилось следующее:

1) Число обращений к диску примерно равно числу блоков в том из индексов и которого по dba_segments меньше всего блоков;
2) Число блоков индекса на 0,5% - 2,8% больше числа обращений к диску;
3) Число листьев в соответствующих индексах leaf_blocks составляет примерно 20% от общего числа, и при этом blevel везде равен 2.

Число блоков в индексах было диапазоне 30 тыс - 900 тыс. Статистика в сессии собиралась включением: "set autotrace on statistics". Размеры таблиц в блоках на порядок больше размеров индексов. Судя по плану запросов - каждый раз идет именно фулл скан индексов.

Собственно вопросы:
1) Это совпадение, что число обращений к диску так совпадает с числом блоков самого "компактного" индекса?
2) Если получение count(*) из таблицы делается по компактному индексу, то почему не достаточно было добраться до первого листа, а затем только по ним вести пересчет сократив время почти в 2 раза (при blevel = 2 это было бы равно числу блоков + 3),разве листья не ссылаются на следующий элемент в цепочке?
3) Можно ли каким-нибудь образом уменьшить число обращений к диску для таких запросов?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554369
explain plan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
helgisboxсовпадает с числом блоков самого "компактного" индексаCовпадение. Построй регулярный индекс по полю, где большинство значений null. Он будет самым компактным.

helgisbox не достаточно было добраться до первого листаНе внятно кому-куда достаточно добраться. По количеству логических чтений, достаточно пройти по листам - IFS, но это одноблочные чтения. IFFS дешевле по io. Хотя на ssd, не отягощенном префетчами, последовательное или случайное чтение - без разницы.

helgisbox3) Можно ли каким-нибудь образом уменьшить число обращений к диску для таких запросов?Да. количество обращений к диску можно сократить до нуля. Просто не считать бесполезные count(*).
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554413
helgisbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
explain planhelgisboxсовпадает с числом блоков самого "компактного" индексаCовпадение. Построй регулярный индекс по полю, где большинство значений null. Он будет самым компактным.

helgisbox не достаточно было добраться до первого листаНе внятно кому-куда достаточно добраться. По количеству логических чтений, достаточно пройти по листам - IFS, но это одноблочные чтения. IFFS дешевле по io. Хотя на ssd, не отягощенном префетчами, последовательное или случайное чтение - без разницы.

helgisbox3) Можно ли каким-нибудь образом уменьшить число обращений к диску для таких запросов?Да. количество обращений к диску можно сократить до нуля. Просто не считать бесполезные count(*).

1. Стало быть, если он даже в план включил этот индекс, то он знал, что поле не может принимать значения null или является ключевым.
2. У меня не SSD случай.
3. Если не count(*), то что будет полезным для получения числа строк таблицы?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554429
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
helgisbox3. Если не count(*), то что будет полезным для получения числа строк таблицы?
Зависит от того, насколько важна точность и как часто собирается статистика.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554446
helgisbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tru55helgisbox3. Если не count(*), то что будет полезным для получения числа строк таблицы?
Зависит от того, насколько важна точность и как часто собирается статистика.
Раз в сутки, нужно просто видеть динамику. Иногда существенные изменения связаны с определенными регламентами, которые нужно корректировать. В оперативных таблицах это не так заметно, а вот данные с накоплением - там видно. Смущает, когда такой запрос своим фуллсканом по индексу минут пять держит пачку распараллеленных запросов.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554459
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554485
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shtock,

авторOracle 11.2.0.4.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554622
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dba_tab_modification
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554639
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shtockdba_tab_modification

Код: plaintext
1.
2.
INSERTS	NUMBER	 	 Approximate  number of inserts since the last time statistics were gathered
UPDATES	NUMBER	 	 Approximate  number of updates since the last time statistics were gathered
DELETES	NUMBER	 	 Approximate  number of deletes since the last time statistics were gathered

SY.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554732
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
helgisboxСмущает, когда такой запрос своим фуллсканом по индексу минут пять держит пачку распараллеленных запросов.
Мнээ... Вот с этого места поподробнее - что тут как кого держит?

А по существу, если точность и своевременность не [очень] важна, то можно ещё вот так:

init.ora:
Код: sql
1.
2.
query_rewrite_enabled=true;
query_rewrite_integrity=stale_tolerated;


Код: plsql
1.
2.
3.
4.
5.
create materialized view <table>_rcmw 
enable query rewrite
refresh on demand
as
select count(*) cnt from <table>;


и обновлять раз в сутки ночью или ранним утром в бэкграунде. Тогда select count(*) from <table> будет выполняться вообще мгновенно.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554740
Bobby Z.и обновлять раз в суткине только обновлять, но селектить раз в сутки
helgisboxРаз в сутки, нужно просто видеть динамику.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554754
Фотография Vladimir Filin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
helgisboxРаз в сутки, нужно просто видеть динамику.
Как вариант, sample_clause:
https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10002.htm#i2065953

Нужно будет подбирать размер и оценивать точность
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554864
helgisbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем откликнувшимся. В принципе - скорость отработки запроса не критична. Есть какой-нибудь флаг оптимизатору, чтобы он распараллеливал конкретно в таком запросе не по дефолту, а всего на 2 - 4 процесса сам запрос? В принципе - будет все равно, даже если он отрабатывать будет полчаса. Он же таблицу на "апдейты и инсерты" в такое время не лочит ;)
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39554891
alter session
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
helgisboxне лочитзато параллель сбрасывает грязные буферы на диск и затем физически читает. Производительность других операций может существенно просесть на системе со слабым io. Если таблиц много, лучше запускать несколько джобов по подмножеству таблиц.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39555014
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему в указанных условиях не использовать результаты штатного сбора статистики?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39555191
Relict_35
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2andrey_anonymous так имеешь ввиду?:
Код: sql
1.
2.
3.
select num_rows
from all_tаbles
where table_name = 'имя'
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39555244
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
helgisboxЕсть какой-нибудь флаг оптимизатору, чтобы он распараллеливал конкретно в таком запросе не по дефолту, а всего на 2 - 4 процесса сам запрос? Хинт PARALLEL принимает в качестве аргумента DOP (degree of parallelism), так что если написать, скажем,
Код: plsql
1.
SELECT /*+ PARALLEL(4) */ COUNT(*) FROM TAB;

, то 4 параллельных процесса (+QC) этот запрос и будут выполнять. А NOPARALLEL вообще запретит выполнять запрос параллельно, равно как и
Код: plsql
1.
ALTER TABLE TAB NOPARALLEL;

приведёт к тому, что запросы без хинтов будут выполняться последовательно.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39555259
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobby Z.А NOPARALLEL вообще запретит выполнять запрос параллельно, равно как и
Код: plsql
1.
ALTER TABLE TAB NOPARALLEL;

приведёт к тому, что запросы без хинтов будут выполняться последовательно.
Ну как бы случаи разные бывают =)
Код: plsql
1.
alter session force parallel query
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39555381
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
helgisboxtru55пропущено...

Зависит от того, насколько важна точность и как часто собирается статистика.
Раз в сутки, нужно просто видеть динамику. Иногда существенные изменения связаны с определенными регламентами, которые нужно корректировать. В оперативных таблицах это не так заметно, а вот данные с накоплением - там видно. Смущает, когда такой запрос своим фуллсканом по индексу минут пять держит пачку распараллеленных запросов.
не мучай базу - смотри в статистику
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556401
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|Bobby Z.А NOPARALLEL вообще запретит выполнять запрос параллельно, равно как и
Код: plsql
1.
ALTER TABLE TAB NOPARALLEL;

приведёт к тому, что запросы без хинтов будут выполняться последовательно.
Ну как бы случаи разные бывают =)
Код: plsql
1.
alter session force parallel query

А зачем? И какой DOP будет? А если я после этого в той же сессии сделаю
Код: plsql
1.
alter session set events '10384 trace name context forever, level 16384'

то тогда что будет?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556416
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Bobby Z.
Код: plsql
1.
alter session set events '10384 trace name context forever, level 16384'

к слову такая "параллель" может быть быстрее чем при таком же но не параллельном плане за счет безусловных direct path reads в отличие от adaptive serial direct path reads :)
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556444
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobby Z.AlexFF__|пропущено...

Ну как бы случаи разные бывают =)
Код: plsql
1.
alter session force parallel query

А зачем? И какой DOP будет? А если я после этого в той же сессии сделаю
Код: plsql
1.
alter session set events '10384 trace name context forever, level 16384'

то тогда что будет?
Ты хочешь, чтобы я за тебя проверил?
Мне не надо, я знаю как это работает )
А вот ты с помощью тестов мог бы увидеть, как форсирование parallel dml позволяет системе самой определить DOP на твоей "непараллеливаемой" таблице с ALTER TABLE TAB NOPARALLEL;
Если конечно система решит параллелить, чего, впрочем, не трудно добиться.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556466
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Bobby Z.
Код: plsql
1.
ALTER TABLE TAB NOPARALLEL;


приведёт к тому, что запросы без хинтов будут выполняться последовательно.ну это не правда...
простенький пример:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
alter system set parallel_max_servers=16;
alter system set parallel_degree_limit=8;
alter system set parallel_min_time_threshold=1 scope=memory;
drop table t purge;

create table t noparallel as select dummy, rpad(level,400) padding from dual connect by level<=1000;
call dbms_stats.gather_table_stats('','t');
call dbms_stats.set_table_stats(user,'T',numrows => 1e7, numblks => 1e6);

alter table t parallel 4;
select t.degree from user_tables t where table_name='T';

alter table t noparallel;
select t.degree from user_tables t where table_name='T';

pause;

alter session set parallel_degree_policy=auto;

explain plan for update t set dummy='Y';
select * from table(dbms_xplan.display);
pause;


результат
Код: plsql
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.
38.
39.
40.
41.
42.
43.
SQL> alter system set parallel_max_servers=16;
SQL> alter system set parallel_degree_limit=8;
SQL> alter system set parallel_min_time_threshold=1 scope=memory;
SQL> alter table t noparallel;

Table altered.

SQL> select t.degree from user_tables t where table_name='T';

DEGREE
----------------------------------------
         1

1 row selected.

SQL> alter session set parallel_degree_policy=auto;

Session altered.

SQL> explain plan for update t set dummy='Y';

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------
Plan hash value: 1378397380

---------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT      |          |    10M|    19M|   100K  (1)| 00:00:04 |        |      |            |
|   1 |  UPDATE               | T        |       |       |            |          |        |      |            |
|   2 |   PX COORDINATOR      |          |       |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000 |    10M|    19M|   100K  (1)| 00:00:04 |  Q1,00 | P->S | QC (RAND)  |
|   4 |     PX BLOCK ITERATOR |          |    10M|    19M|   100K  (1)| 00:00:04 |  Q1,00 | PCWC |            |
|   5 |      TABLE ACCESS FULL| T        |    10M|    19M|   100K  (1)| 00:00:04 |  Q1,00 | PCWP |            |
---------------------------------------------------------------------------------------------------------------

Note
-----
   - automatic DOP: Computed Degree of Parallelism is 3



nb: это не параллельный дмл!
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556475
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|Bobby Z.пропущено...
А зачем? И какой DOP будет? А если я после этого в той же сессии сделаю
Код: plsql
1.
alter session set events '10384 trace name context forever, level 16384'

то тогда что будет?
Ты хочешь, чтобы я за тебя проверил?
Мне не надо, я знаю как это работает )
А вот ты с помощью тестов мог бы увидеть, как форсирование parallel dml позволяет системе самой определить DOP на твоей "непараллеливаемой" таблице с ALTER TABLE TAB NOPARALLEL;
Если конечно система решит параллелить, чего, впрочем, не трудно добиться.Ну молодец, что знаешь. Хотя тогда должен бы знать, что тут и проверять нечего и тесты никакие не нужны, и форсирование parallel dml ну никакой совершенно роли не играет в этом случае. Или я не понял что "это" ты знаешь как работает?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556486
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderBobby Z.
Код: plsql
1.
ALTER TABLE TAB NOPARALLEL;


приведёт к тому, что запросы без хинтов будут выполняться последовательно.ну это не правда...
Код: plsql
1.
alter session set parallel_degree_policy=auto;

Ну нет, мы так не договаривались..! AutoDOP до сих пор вообще не упоминался, ОП не привёл вообще никаких parallel* параметров, то есть считаем, что всё по умолчанию, а по умолчанию в 11.2.0.4 parallel_degree_policy=manual. AutoDOP это вообще отдельная, длинная и грустная песня, не к ночи будь помянута (и Ваш пример тому лишнее подтверждение). Так что давайте не будем меряться. А ты вы тут уже начали изгаляться кто знает круче способ нае..ть заставить Оракл что-то выполнить или не выполнить параллельно (да и я вместе с вами, не удержался :) ). Здорово, конечно, что вы тут все такие опытные и разных фокусов умеете, но как это помогает ОП?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556487
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobby Z.А ты вы...=> А то вы...
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556492
only if you have
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtendernb: это не параллельный дмл!так откуда ему взяться.
vldbA DML statement can be parallelized only if you have explicitly enabled parallel DML in the session or in the SQL statement.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556594
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobby Z.AlexFF__|пропущено...

Ты хочешь, чтобы я за тебя проверил?
Мне не надо, я знаю как это работает )
А вот ты с помощью тестов мог бы увидеть, как форсирование parallel dml позволяет системе самой определить DOP на твоей "непараллеливаемой" таблице с ALTER TABLE TAB NOPARALLEL;
Если конечно система решит параллелить, чего, впрочем, не трудно добиться.Ну молодец, что знаешь. Хотя тогда должен бы знать, что тут и проверять нечего и тесты никакие не нужны, и форсирование parallel dml ну никакой совершенно роли не играет в этом случае. Или я не понял что "это" ты знаешь как работает?
Ок, потрачу пару минут, а то малограмотные персонажи уже задолбали вводить всех в заблуждение.

Код: plsql
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
SQL> select name, value from v$ses_optimizer_env where sid = sys_context('USERENV', 'SID') and name = 'parallel_query_mode'
NAME                                     VALUE
---------------------------------------- -------------------------
parallel_query_mode                      enabled


create table TAB parallel 4 as select * from dba_objects;


select count(*) from TAB;

Plan hash value: 2670378475
---------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name     | E-Rows | Cost (%CPU)| E-Time   |    TQ  |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |        |  2352 (100)|          |        |      |            |
|   1 |  SORT AGGREGATE        |          |      1 |            |          |        |      |            |
|   2 |   PX COORDINATOR       |          |        |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM) | :TQ10000 |      1 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |          |      1 |            |          |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR |          |  84000 |  2352   (0)| 00:00:25 |  Q1,00 | PCWC |            |
|*  6 |       TABLE ACCESS FULL| TAB      |  84000 |  2352   (0)| 00:00:25 |  Q1,00 | PCWP |            |
---------------------------------------------------------------------------------------------------------


ALTER TABLE TAB NOPARALLEL;

select count(*)  from TAB;

Plan hash value: 1464076394
--------------------------------------------------------------------
| Id  | Operation          | Name | E-Rows | Cost (%CPU)| E-Time   |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |        |   408 (100)|          |
|   1 |  SORT AGGREGATE    |      |      1 |            |          |
|   2 |   TABLE ACCESS FULL| TAB  |  84000 |   408   (1)| 00:00:05 |
--------------------------------------------------------------------


alter session force parallel query;

select count(*)   from TAB;

Plan hash value: 2670378475
---------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name     | E-Rows | Cost (%CPU)| E-Time   |    TQ  |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |        |   588 (100)|          |        |      |            |
|   1 |  SORT AGGREGATE        |          |      1 |            |          |        |      |            |
|   2 |   PX COORDINATOR       |          |        |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM) | :TQ10000 |      1 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |          |      1 |            |          |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR |          |  84000 |   588   (0)| 00:00:07 |  Q1,00 | PCWC |            |
|*  6 |       TABLE ACCESS FULL| TAB      |  84000 |   588   (0)| 00:00:07 |  Q1,00 | PCWP |            |
---------------------------------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556678
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|Ок, потрачу пару минут, а то малограмотные персонажи уже задолбали вводить всех в заблуждение.

на скоко "потоков" распараллелил из плана можно узнать?

.....
stax
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556689
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxAlexFF__|Ок, потрачу пару минут, а то малограмотные персонажи уже задолбали вводить всех в заблуждение.

на скоко "потоков" распараллелил из плана можно узнать?

.....
stax
Система сама решает, на моей БД
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SQL> select sql_id, px_servers_executions from v$sql where sql_text like 'select count(*)   from TAB%'
  2  /
SQL_ID        PX_SERVERS_EXECUTIONS
------------- ---------------------
ctf6wxn6uxyqk                    16

SQL> 
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39556713
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|Staxпропущено...

на скоко "потоков" распараллелил из плана можно узнать?

.....
stax
Система сама решает, на моей БД
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SQL> select sql_id, px_servers_executions from v$sql where sql_text like 'select count(*)   from TAB%'
  2  /
SQL_ID        PX_SERVERS_EXECUTIONS
------------- ---------------------
ctf6wxn6uxyqk                    16

SQL> 


спасибо, понял где смотреть

.....
stax
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39557961
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|Bobby Z.пропущено...
Ну молодец, что знаешь. Хотя тогда должен бы знать, что тут и проверять нечего и тесты никакие не нужны, и форсирование parallel dml ну никакой совершенно роли не играет в этом случае. Или я не понял что "это" ты знаешь как работает?
Ок, потрачу пару минут, а то малограмотные персонажи уже задолбали вводить всех в заблуждение.
Код: plsql
1.
планы почиканы за ненадобностью


Ой, как я люблю вот таких напыщенных самонадеянных всезнаек, круче которых только варёные яйца. :) Ну исполать те, многограмотный ты наш Капитан Очевидность, показал нам, неучам, что делает force parallel, что б мы делали вообще без тебя, Кэп... Теперь погугли event 10384, level 16384 - может откроешь для себя, что план выполнения запроса не всегда соответствует тому, как он на самом деле выполняется (другими словами, карта местности не есть сама местность).

Хотя, учитывая вот это: AlexFF__|staxна скоко "потоков" распараллелил из плана можно узнать?
Система сама решает, на моей БД ... 16непохоже, чтоб ты на самом деле знал, как "это" работает, иначе знал бы, хотя бы в простых случаях, как "система сама решает". Ничего не зная о вот этой твоей БД, рискну предположить, что она не кластеризована, parallel_degree_policy=manual, resource manager не активен, остальные parallel* параметры по умолчанию. Тогда она, скорее всего, бегает на 8-ми ядрах (cpu_count=8). Угадал?

И, кстати, запланированный DOP можно из плана узнать, из V$SQL_PLAN.OTHER_XML. V$SQL.PX_SERVERS_EXECUTIONS немного не про то (точнее, вообще не про то).
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558048
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobby Z.И, кстати, запланированный DOP можно из плана узнать, из V$SQL_PLAN.OTHER_XML. V$SQL.PX_SERVERS_EXECUTIONS немного не про то (точнее, вообще не про то).
И опять приходится поправлять малограмотных персонажей.
Именно потому, что даже параллельный план может выполняться в один поток (например выбран весь parallel_max_servers), реальное число потоков пишется в V$SQL.PX_SERVERS_EXECUTIONS.
P.S. Ты не стесняйся, пиши еще, если что непонятно =)
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558523
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|реальное число потоков пишется в V$SQL.PX_SERVERS_EXECUTIONS.
Лезу в v$px_session, вижу degree=32, req_degree=32.
Смотрю v$sql.px_server_executions - 31.

Прокомментируете?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558527
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousAlexFF__|реальное число потоков пишется в V$SQL.PX_SERVERS_EXECUTIONS.
Лезу в v$px_session, вижу degree=32, req_degree=32.
Смотрю v$sql.px_server_executions - 31.
А с этим как быть?
Лезу в v$px_session, вижу degree=16, req_degree=16.
Смотрю v$sql.px_server_executions = 7004

Ы?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558529
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousА с этим как быть?А что неясно?RTFMTotal number of executions performed by parallel execution servers (0 when the statement has never been executed in parallel)Алекса слегка занесло.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558544
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Elic]andrey_anonymousА с этим как быть?А что неясно?RTFM
Да все как бы ясно.
Не сдержался :)
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558692
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicАлекса слегка занесло.Слегка? А мне сослепу показалось, что он вообще поворота не заметил... :D
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558693
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|P.S. Ты не стесняйся, пиши еще, если что непонятно =)Да ладно, чо уж, ты и так достаточно наобъяснял, чтоб я к тебе больше не прислушивался ещё лет несколько пока ты опыта набираешься, спасибо.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558696
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
да всем уже тут хватит чепуху писать...

Staxна скоко "потоков" распараллелил из плана можно узнать?лучше всего смотреть в отчет RTSM(real time sql monitor'a), т.е. px_servers_requested,px_servers_allocated,px_maxdop в v$sql_monitor (параллельные выполнения всегда туда попадают без учета "_sqlmon_threshold") там и причина даунгрейда будет, а при отладке/дебаге - в v$pq_sesstat или если совсем глубоко то врубать px_trace

1. про v$sql_plan.other_xml - это тупо для плана этого чайлда, а реальное выделение слейвов происходит в рантайме, соответственно один и тот же чайлд мог в разное время выполняться с разными доп (не будем усложнять про v$sql_plan_statistics_all.last_xxx + statistics_level, так как это все равно не работает с реально параллельными планами, т.к. туда попадают статистики координатора)
2. про v$sql.px_servers_executions - andrey_anonymous уже тоже подсказал
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558752
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderлучше всего смотреть в отчет RTSM(real time sql monitor'a)
Это все хорошо, вот только монитор не всегда включен по умолчанию, да и отчеты доступны не долго.
А вот что однократный запрос может писать неверные значения в v$sql.px_servers_executions, это интересно.
Если ты или andrey_anonymous приведете кейс - буду благодарен.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558763
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexFF__|,

уровень параллельности потом можно узнать из dba_hist_active_sess_history = px_flags/2097152
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558768
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pihelAlexFF__|,
уровень параллельности потом можно узнать из dba_hist_active_sess_history = px_flags/2097152
Ты точно читал мой вопрос?
AlexFF__|А вот что однократный запрос может писать неверные значения в v$sql.px_servers_executions, это интересно.
Если ты или andrey_anonymous приведете кейс - буду благодарен.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558849
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AlexFF__| однократный запросну начались прыжки в стороны...

AlexFF__|неверные значения в v$sql.px_servers_executionsзначит ты так и не понял, про что тебе намекали....
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558855
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderAlexFF__| однократный запросну начались прыжки в стороны...
AlexFF__|Ок, потрачу пару минут, а то малограмотные персонажи уже задолбали вводить всех в заблуждение.
...
Код: sql
1.
2.
3.
4.
5.
select count(*) from TAB;
...
select count(*)  from TAB;
...
select count(*)   from TAB;



xtenderзначит ты так и не понял, про что тебе намекали....
Я начинаю подозревать тебя в пустословии.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558875
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AlexFF__|,

ох, тяжкий ты человек... еще раз: v$sql агрегирует для чайлда... у тебя кстати в примере их было 3, хотя и два из них были с одинаковыми планами. И если ты еще не сталкивался, то иногда оракл для одного параллельного выполнения создает несколько чайлдов...

AlexFF__|Ок, потрачу пару минут, ак чему это было я вообще не понимаю...
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558878
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
я бы еще понял, если бы ты сразу четко добавил "для однократного выполнения" когда советовал, но сейчас это реально выглядит как прыжки в сторону...
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558889
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AlexFF__|pihelAlexFF__|,
уровень параллельности потом можно узнать из dba_hist_active_sess_history = px_flags/2097152он то тебе чем не угодил? уж из шаред пула твой одиночный запуск раньше вымоет чем из ash... только чуть правильнее с trunc: https://www.freelists.org/post/oracle-l/detect-parallel-queries-that-have-been-serialized,3
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558905
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderк чему это было я вообще не понимаю...
Все, что я сделал в топике, это поправил:
Bobby Z.
Код: plsql
1.
ALTER TABLE TAB NOPARALLEL;

приведёт к тому, что запросы без хинтов будут выполняться последовательно.
Потом привел тест со специально разными sql_id:
Код: sql
1.
2.
3.
4.
5.
select count(*) from TAB;
...
select count(*)  from TAB;
...
select count(*)   from TAB;


И на вопрос, как я в этих тестах узнавал реальные параллели, ответил про px_servers_executions.

И в ответ от вас я узнал:
что значения в v$sql агрегируются
существует sql monitor
ash попадает в историю
Ну ок, полезная информация, только зачем она здесь?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39558915
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AlexFF__|,

ладно-ладно... брейк
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39559228
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|Все, что я сделал в топике, это поправил:
Bobby Z.
Код: plsql
1.
ALTER TABLE TAB NOPARALLEL;

приведёт к тому, что запросы без хинтов будут выполняться последовательно.
Не поправил, а подловил искусственным и не очень уместным примером с force parallel, который я парировал ещё более искусственным event 10384. Отвечал я на простой вопрос: есть какой-то флаг оптимизатору, чтоб он распараллеливал с заранее заданной степенью параллелизма? DEGREE объекта - как раз такой флаг, оптимизатор принимает его во внимание при рассчёте степени параллелизма в нормальных условиях по умолчанию (а других задано не было). Ваши собственные эксперименты, приведённые в топике, это неоднократно подтвердили, когда вы показывали "нормальный случай по умолчанию" и потом "ненормальный" со всякими alter session.

Можно ли заставить оптимизатор игнорировать degree объектов? Конечно, кучей способов - у атрибута самый низкий приоритет при вычислении dop. Но такой вопрос никто не задавал и непонятно, зачем надо было на него отвечать, да ещё в такой невежливой манере. Чтобы в конечном итоге показать, что "я знаю как это работает" - преувеличение? Ну показал...

И обратите внимание, что я написал про посчитанный dop, который можно узнать из плана. Реальный из плана узнать нельзя, ибо, повторюсь, карта местности не есть сама местность. Вы уже обсуждаете откуда узнать dop времени исполнения, то есть, опять отвечаете не на заданный вопрос, а на похожий другой. Тема сложная и интересная, но ТС вообще никаким боком не помогает, по-моему. Сомневаюсь, что ТС вообще этот срач читает. =)
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39561954
helgisbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Много интересного узнал, спасибо!

А вот такой еще есть вопрос. Время от времени некоторые процессы распараллеливаются на 32 сессии. Распараллеливание - это чтобы сделать лучше и быстрее при наличии избытка ресурсов. Но вот если для одной сессии создали 32, а ядер всего 32 и почти все они "пашут". Если появится еще одна пользовательская сессия, полезная, от сервера приложений или от клиента, кто-нибудь из тех, кто параллельно запустился "уступят" ей место. Есть какая-нибудь "выталкивающая" производительность в пользу сессий от клиента, а уже потом только утилизация ресурсов с целью улучшения ответа?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39562011
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
helgisboxМного интересного узнал, спасибо!

А вот такой еще есть вопрос. Время от времени некоторые процессы распараллеливаются на 32 сессии. Распараллеливание - это чтобы сделать лучше и быстрее при наличии избытка ресурсов. Но вот если для одной сессии создали 32, а ядер всего 32 и почти все они "пашут". Если появится еще одна пользовательская сессия, полезная, от сервера приложений или от клиента, кто-нибудь из тех, кто параллельно запустился "уступят" ей место. Есть какая-нибудь "выталкивающая" производительность в пользу сессий от клиента, а уже потом только утилизация ресурсов с целью улучшения ответа?

"Это фантастика" (С) ))
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39562154
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
helgisboxМного интересного узнал, спасибо!

Есть какая-нибудь "выталкивающая" производительность в пользу сессий от клиента, а уже потом только утилизация ресурсов с целью улучшения ответа?Есть Resource Manager с его consumer groups и планами распределения ресурсов, но в плане вычислительных ресурсов (CPU) он умеет только тормозить процессы, заставляя их ждать часть времени по специальному ожиданию "resmgr: cpu quantum", что не совсем разнозначно "выталкиванию". Надо очень чётко понимать, как именно ResMan "управляет" потреблением CPU и как его использование влияет на время отклика, особенно на нагруженных системах (со средней загрузкой CPU выше 30%). Да и на ненагруженных тоже. Плюс там довольно много неприятных багов было в разное время, так что от версии тоже зависит.
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39562603
helgisbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какая печаль, получается, что вспомогательное средство оказалось то самой лопатой, нет - граблями, которая и по тебе...
Версия 11.2.0.4. Если parallel_max_servers выставить с таким расчетом, чтобы оставалось гарантировано какое-то количество сессий для обычных прикладных запросов, до за пределы parallel_max_servers это "помощь" не уйдет?

То есть, к примеру, при 32 ядрах, сделать parallel_max_servers = 25, чтобы гарантировано 8 ядер всегда были для обычных запросов?
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39562604
helgisbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
helgisboxКакая печаль, получается, что вспомогательное средство оказалось то самой лопатой, нет - граблями, которая и по тебе...
Версия 11.2.0.4. Если parallel_max_servers выставить с таким расчетом, чтобы оставалось гарантировано какое-то количество сессий для обычных прикладных запросов, до за пределы parallel_max_servers это "помощь" не уйдет?

То есть, к примеру, при 32 ядрах, сделать parallel_max_servers = 25, чтобы гарантировано 8 ядер всегда были для обычных запросов?
24 разумеется, опечатка ;)
...
Рейтинг: 0 / 0
Каким образом выполяется count(*) и как его можно потимизировать
    #39562681
PX server/PQ slave
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
helgisboxчтобы гарантированоВсе значительно иначе. Рассуждать о гарантированности в отрыве от реальной нагрузки и железа бессмысленно. В расчетах дефолтных параметров параллелизма оракл обычно ориентируется на удвоенное количество ядер. Но есть еще ориентир parallel_io_cap_enabled, который играет рояль в сочетании с calibrate_io.
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каким образом выполяется count(*) и как его можно потимизировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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