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

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

А может ли кто-нибудь показать пример такой перестройки? Так сказать для полноты картины?
...
Рейтинг: 0 / 0
26.01.2018, 15:20
    #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
26.01.2018, 16:21
    #39591784
Desert_Nomad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фактор кластеризации - перестройка таблицы
Вячеслав, спасибо огромное!

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

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

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

Очень странная манера изложения, как по мне. Если я понял смысл этого текста, то он заключается в том что "не забудьте вставить в запрос все необходимые предикаты".
...
Рейтинг: 0 / 0
27.01.2018, 21:06
    #39592255
Rudyshin Sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фактор кластеризации - перестройка таблицы
можно еще добавить, что CF не имеет значение для индексов доступ, к которым происходит по "INDEX UNIQUE SCAN"
и в примере Вячаслава, скорее всего имело бы смысл пересоздать таблицу
...
Рейтинг: 0 / 0
27.01.2018, 21:26
    #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
29.01.2018, 10:00
    #39592620
Desert_Nomad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фактор кластеризации - перестройка таблицы
Коллеги, всем спасибо за комментарии, xtender - у отдельно - за ссылки и дополнительные сведения.
Уважаемый Вячеслав уже дал то, что меня конкретно интересовало, фактически тему можно закрывать.
...
Рейтинг: 0 / 0
29.01.2018, 11:36
    #39592681
Фактор кластеризации - перестройка таблицы
мне одному показалось, что статья по ссылке, мягко говоря, "никакая" ?
Больше похоже на подборку "наиболее частых заблуждений в области оптимизации запросов"....
...
Рейтинг: 0 / 0
29.01.2018, 12:17
    #39592711
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фактор кластеризации - перестройка таблицы
Добрый Э - Эхмне одному показалось, что статья по ссылке, мягко говоря, "никакая" ?
Больше похоже на подборку "наиболее частых заблуждений в области оптимизации запросов"....

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

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


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