powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Фактор кластеризации - перестройка таблицы
16 сообщений из 16, страница 1 из 1
Фактор кластеризации - перестройка таблицы
    #39591698
Desert_Nomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые коллеги, добрый день.

В журнале "Форс" в статье про оптимизацию подзапросов в разделе 5 "Индекс имеет большой фактор кластеризации CLUSTERING_FACTOR" прочитал такую фразу:
Валерий МихеичевПервое решение при большом ФК является убрать существующий индекс как не эффективный. Второе решение, если данный индекс наиболее часто применяется в запросах и он нужен, то перестроить структуру таблицы таким образом, чтобы строки в блоках таблицы были упорядочены в том же порядке, в котором расположена информация по данным строкам в индексе, т.е. сделать кластерными блоки таблицы, уменьшив таким образом число перемещений от одного блока к другому при работе индекса.

А может ли кто-нибудь показать пример такой перестройки? Так сказать для полноты картины?
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39591747
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тока надо не забывать, что если по одному индексу CF улучшается, то, как правило, по другим портится
Код: 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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
tst> create table t1 as select object_id, object_name from all_objects;

Table created.

tst> create unique index pk_t1 on t1(object_id);

Index created.

tst> create index t1_idx_name on t1(object_name);

Index created.

tst> alter table t1 add primary key(object_id);

Table altered.

tst> exec dbms_stats.gather_table_stats(user, 'T1', cascade=>true, method_opt=>'for all columns size 1')

PL/SQL procedure successfully completed.

tst> select index_name, t.num_rows, t.blocks, clustering_factor
  2  from user_tables t, user_indexes i
  3  where t.table_name=i.table_name and t.table_name='T1';

INDEX_NAME                       NUM_ROWS     BLOCKS CLUSTERING_FACTOR
------------------------------ ---------- ---------- -----------------
T1_IDX_NAME                          6493         30              2372
PK_T1                                6493         30                93

tst> create table t1_bis as select * from t1 where 1=2;

Table created.

tst> alter table t1_bis modify (object_id null, object_name null);

Table altered.

tst> set serveroutput on
tst> declare n_errs number := 0;
  2  begin
  3   dbms_redefinition.start_redef_table(user, 'T1', 'T1_BIS', orderby_cols=>'OBJECT_NAME');
  4   dbms_redefinition.copy_table_dependents(user, 'T1', 'T1_BIS', num_errors=>n_errs);
  5   dbms_output.put_line('copy_table_dependents: num_errors='||n_errs);
  6  end;
  7  /
copy_table_dependents: num_errors=0

PL/SQL procedure successfully completed.

tst> exec dbms_redefinition.finish_redef_table(user, 'T1', 'T1_BIS')

PL/SQL procedure successfully completed.

tst> exec dbms_stats.gather_table_stats(user, 'T1', cascade=>true, method_opt=>'for all columns size 1')

PL/SQL procedure successfully completed.

tst> select index_name, t.num_rows, t.blocks, clustering_factor
  2  from user_tables t, user_indexes i
  3  where t.table_name=i.table_name and t.table_name='T1';

INDEX_NAME                       NUM_ROWS     BLOCKS CLUSTERING_FACTOR
------------------------------ ---------- ---------- -----------------
T1_IDX_NAME                          6493         30                26
PK_T1                                6493         30              3009

tst> 

...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39591784
Desert_Nomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав, спасибо огромное!

Пошел внимательно изучать....
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39591804
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Desert_Nomadвнимательно изучать....В статье озвучено, для каких способов обращения к индексу стоит переживать за "ФК"? (ох уж эти изобретатели провокационных аббревиатур)
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592019
Desert_Nomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-В статье озвучено, для каких способов обращения к индексу стоит переживать за "ФК"?
Ну тогда поделюсь линком, да не сочтут меня достойные модераторы за рекламщика сторонних ресурсов и не буду я за это больно бит, может даже ногами (с):
http://www.fors.ru/upload/magazine/07/http_text/russia_mihjeichev_plan_recomendations.html
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592046
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Desert_Nomad,

начал было комментировать, но отвлекли по работе и теперь уже просто лень. В общем, читайте лучше Льюиса, а то так даже правильно читать планы не научитесь
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592178
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Льюиса в книжке был даже запрос которым можно посчитать фактор кластеризации.
Может показаться бессмысленной вещью, но может пригодится, если например, у вас будет подозрение, что цифры резко завысил какой-то определенный кусок таблицы - можно будет его найти.
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592180
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из статьи по ссылке:

авторИмеются сильные индексы, но они соперничают между собой.
Это происходит тогда, когда в условии where имеется строка, в которой столбец одной таблицы равен столбцу другой таблицы. При этом на обоих столбцах построены сильные или уникальные индексы. Например, в условии Where имеется строка AND A.ISN=B.ISN. При этом оба столбца ISN разных таблиц имеют уникальные индексы. Однако, эффективно может работать индекс только одного столбца (левого или правого в равенстве). Индекс другого столбца, в лучшем случае, даст FAST FULL SCAN. В этой ситуации, чтобы эффективно заработали оба индекса, потребуется вести дополнительное условие для одного из столбцов.

Очень странная манера изложения, как по мне. Если я понял смысл этого текста, то он заключается в том что "не забудьте вставить в запрос все необходимые предикаты".
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592255
Rudyshin Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно еще добавить, что CF не имеет значение для индексов доступ, к которым происходит по "INDEX UNIQUE SCAN"
и в примере Вячаслава, скорее всего имело бы смысл пересоздать таблицу
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592257
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Desert_NomadНу тогда поделюсь линком, да не сочтут меня достойные модераторы за рекламщика сторонних ресурсов и не буду я за это больно бит, может даже ногами (с):
http://www.fors.ru/upload/magazine/07/http_text/russia_mihjeichev_plan_recomendations.html
все равно лень комментировать все ошибки там, поэтому отвечу только по поводу популярного заблуждения
http://www.fors.ru/upload/magazine/07/http_text/russia_mihjeichev_plan_recomendations.html При анализе план просматриваетcя снизу вверх .
Читай тут: 19813880
Продублирую с небольшой правкой и дополнением:

Проще всего объяснять, что каждая строка плана - это вызов некой функции. Собственно, V$SQL_PLAN.OPERATION - это название функции, а V$SQL_PLAN.OPTIONS - это параметр, определяющий ее алгоритм/подфункцию.
чуть подробнееНапример, операция "TABLE ACCESS" имеет следующие варианты:
BY GLOBAL INDEX ROWID BATCHED

BY INDEX ROWID

BY INDEX ROWID BATCHED

BY LOCAL INDEX ROWID BATCHED

BY USER ROWID

CLUSTER

FULL

SAMPLE
А у INDEX:
FAST FULL SCAN
FULL SCAN
FULL SCAN (MIN/MAX)
RANGE SCAN
RANGE SCAN (MIN/MAX)
RANGE SCAN DESCENDING
SAMPLE FAST FULL SCAN
SKIP SCAN
UNIQUE SCAN

Т.к. алгоритмы совершенно разные, то и смысла называть только OPERATION без OPTIONS не имеет, поэтому DBMS_XPLAN как и другие инструменты их конкатенируют, например TABLE ACCESS FULL, TABLE ACCESS BY INDEX ROWID. И мы говоря о FULL TABLE SCAN имеем ввиду функцию TABLE ACCESS с параметром FULL.
Соответствие названий некоторых операций и реальных сишных функций можно увидеть в скрипте у Танела Подера:
http://blog.tanelpoder.com/files/scripts/tools/unix/os_explain

Короткий пример из os_explain
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
s/qerbm/MINUS: /g;
s/qercb/CONNECT BY: /g;
s/qerco/COUNT: /g;
s/qerfu/UPDATE: /g;
s/qerfx/FIXED TABLE: /g;
s/qergr/GROUP BY ROLLUP: /g;
s/qergs/GROUP BY SORT: /g;
s/qerhj/HASH JOIN: /g;
s/qeril/IN-LIST: /g;
s/qerix/INDEX: /g;
s/qerjot/NESTED LOOP JOIN: /g;
s/qerjo/NESTED LOOP OUTER: /g;
s/qerns/GROUP BY NO SORT: /g;
s/qeroc/OBJECT COLLECTION ITERATOR: /g;
s/qerso/SORT: /g;
s/qertb/TABLE ACCESS: /g;
s/qerua/UNION-ALL: /g;
s/qergh/HASH GROUP BY: /g



При необходимости каждая строка плана запускает, останавливает и обрабатывает дочерние операции. А каким именно образом и сколько раз она их запускает зависит от самой операции и ее параметров.
пара примеровНапример, HASH JOIN сначала вычитывает все результаты первой дочерней операции(build table) и только потом запускает вторую (prob table), a NESTED LOOPS получает строку из первой дочерней и для нее запускает вторую дочернюю, затем запускает снова первую, чтобы получить очередную строку и для нее снова вторую и тд...
Или еще более простой пример с select * from dual where 1=0
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     2 |     0   (0)|          |
|*  1 |  FILTER            |      |       |       |            |          |
|   2 |   TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(NULL IS NOT NULL)

В данном случае операция FILTER не запускает дочерний TABLE ACCESS FULL, т.к. условие ложно
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592620
Desert_Nomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, всем спасибо за комментарии, xtender - у отдельно - за ссылки и дополнительные сведения.
Уважаемый Вячеслав уже дал то, что меня конкретно интересовало, фактически тему можно закрывать.
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592681
мне одному показалось, что статья по ссылке, мягко говоря, "никакая" ?
Больше похоже на подборку "наиболее частых заблуждений в области оптимизации запросов"....
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592711
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эхмне одному показалось, что статья по ссылке, мягко говоря, "никакая" ?
Больше похоже на подборку "наиболее частых заблуждений в области оптимизации запросов"....

Да нет, просто некий разработчик с опытом 2-5 года поделился своими мыслями.
Понятно что с высоты 10-летнего и более опыта многие из этих мыслей выглядят неверными, а то и глупыми. Это нормально.
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592766
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Добрый Э - Эхмне одному показалось, что статья по ссылке, мягко говоря, "никакая" ?
Больше похоже на подборку "наиболее частых заблуждений в области оптимизации запросов"....Большая часть - это не то, чтобы прямо совсем заблуждения, а просто эдакая полуправда - они применимы только в очень узком диапазоне очень специфических проблем: чуть-чуть другие условия и это превратится во "вредные советы". Это как приметы: красный безоблачный закат - значит погода завтра будет теплая и ветреная
Собственно, это то за что так ругают Бурлесона. В целом, у нас у всех, независимо от опыта и знаний, есть какие-то свои "приметы", например, я недавно траблшутил "ORA-01483: invalid length for DATE or NUMBER bind variable" после апгрейда на 12.2 - казалось бы типичная проблема приложения, но начал разбираться и оказалось, что проблема не в приложении, а оракловом баге (он тупо перемешивал порядок биндов при определенных условиях)

зы. В принципе, я очень уважаю тех, кто генерирует свой уникальный контент, а не копипастит и не пересказывает чужое с добавлением ошибок, вызванных непониманием оригинальной статьи. Вообще не понимаю, зачем пересказывать статьи топовых спецов... А ведь большинство оракловых конференций и блогов из этого и состоят.
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592781
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderне понимаю, зачем пересказывать статьи топовых спецов...Школьная привычка писать контрольную после изучения материала. Только оценки ставит не один учитель, а множество учеников.
...
Рейтинг: 0 / 0
Фактор кластеризации - перестройка таблицы
    #39592817
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderВообще не понимаю, зачем пересказывать статьи топовых спецов...
Статьи топовых спецов обычно ориентированы на специалистов и потому нередко требуют заметного бэкграунда просто для понимания написанного... и нередко там "многабукф".
Потому трансляция статьи top-спеца middle-спецом для future-спеца в виде краткого резюме "гражданочка, ты туда не хады, ты сюда хады, снег башка попадет - савсем мертвый будэшъ" (с) смысл имеет.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Фактор кластеризации - перестройка таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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