Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Hybrid Histograms  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 866
Оракл преподносит их как лучшее из двух миров
https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/histograms.html#GUID-59C57EDF-E763-436A-9CB2-B59A536A10F7
A hybrid histogram combines characteristics of both height-based histograms and frequency histograms. This "best of both worlds" approach enables the optimizer to obtain better selectivity estimates in some situations.

The height-based histogram sometimes produces inaccurate estimates for values that are almost popular. For example, a value that occurs as an endpoint value of only one bucket but almost occupies two buckets is not considered popular.

To solve this problem, a hybrid histogram distributes values so that no value occupies more than one bucket, and then stores the endpoint repeat count value, which is the number of times the endpoint value is repeated, for each endpoint (bucket) in the histogram. By using the repeat count, the optimizer can obtain accurate estimates for almost popular values.


Но на мой взгляд концепция (или текущая реализация?) какая-то недоделанная. Ок, endpoint repeat count это хорошо и избегание размазывания супер популярных значений по нескольким бакетам имеет смысл.

Совершенно непонятно зачем Оракл засовывает в бакеты гибридной по одному значению чтоб потом в последний бакет засунуть "всё подряд". Соответственно полное фиско с estimate для 1111.

Таблица
DROP TABLE tab1 PURGE;

CREATE TABLE tab1 AS
select rownum id, t.id record_type, 'Description for ' || rownum AS description
from
(select 0 id from dual connect by level <= 1e3
union all
select rownum from dual connect by level <= 1e3
union all
select 9999 from dual connect by level <= 1e3
union all
select 1111 from dual connect by level <= 1111) t;

ALTER TABLE tab1 ADD CONSTRAINT tab1_pk PRIMARY KEY (id);


Тест
exec dbms_stats.gather_table_stats(user, 'TAB1', method_opt => 'FOR COLUMNS RECORD_TYPE SIZE 200');
select histogram from user_tab_columns where table_name = 'TAB1' and column_name = 'RECORD_TYPE';

explain plan for select * from tab1 where record_type = 1111;
select * from table(dbms_xplan.display(format => 'basic rows'));

exec dbms_stats.gather_table_stats(user, 'TAB1', estimate_percent=>100, method_opt => 'FOR COLUMNS RECORD_TYPE SIZE 200');
select histogram from user_tab_columns where table_name = 'TAB1' and column_name = 'RECORD_TYPE';

explain plan for select * from tab1 where record_type = 1111;
select * from table(dbms_xplan.display(format => 'basic rows'));


Результат
HISTOGRAM
---------------
HYBRID

------------------------------------------
| Id  | Operation         | Name | Rows  |
------------------------------------------
|   0 | SELECT STATEMENT  |      |     2 |
|   1 |  TABLE ACCESS FULL| TAB1 |     2 |
------------------------------------------

HISTOGRAM
---------------
HEIGHT BALANCED

------------------------------------------
| Id  | Operation         | Name | Rows  |
------------------------------------------
|   0 | SELECT STATEMENT  |      |  1110 |
|   1 |  TABLE ACCESS FULL| TAB1 |  1110 |
------------------------------------------


Если вдруг кому интересно посмотреть на гистограммы
SELECT endpoint_number, endpoint_value, endpoint_repeat_count
FROM   user_tab_histograms t
WHERE  table_name  = 'TAB1'
AND    column_name = 'RECORD_TYPE'
ORDER BY endpoint_value;


В этом конкретном случае можно вывернуться через Top Frequency ибо число очень популярных значений меньше числа бакетов. Но если вернуться к гибридным, мне кажется для N бакетов можно было бы выделить M (M<N) очень популярных значений (по одному на бакет), а между ними построить сбалансированную по высоте. Вот это был бы гибрид! :)

+ гистограммы
HYBRID
ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_REPEAT_COUNT
--------------- -------------- ---------------------
           1000              0                  1000
           1001              1                     1
           1002              2                     1
           1003              3                     1
           1004              4                     1
           1005              5                     1
           1006              6                     1
           1007              7                     1
           1008              8                     1
           1009              9                     1
           1010             10                     1
           1011             11                     1
           1012             12                     1
           1013             13                     1
           1014             14                     1
           1015             15                     1
           1016             16                     1
           1017             17                     1
           1018             18                     1
           1019             19                     1
           1020             20                     1
           1021             21                     1
           1022             22                     1
           1023             23                     1
           1024             24                     1
           1025             25                     1
           1026             26                     1
           1027             27                     1
           1028             28                     1
           1029             29                     1
           1030             30                     1
           1031             31                     1
           1032             32                     1
           1033             33                     1
           1034             34                     1
           1035             35                     1
           1036             36                     1
           1037             37                     1
           1038             38                     1
           1039             39                     1
           1040             40                     1
           1041             41                     1
           1042             42                     1
           1043             43                     1
           1044             44                     1
           1045             45                     1
           1046             46                     1
           1047             47                     1
           1048             48                     1
           1049             49                     1
           1050             50                     1
           1051             51                     1
           1052             52                     1
           1053             53                     1
           1054             54                     1
           1055             55                     1
           1056             56                     1
           1057             57                     1
           1058             58                     1
           1059             59                     1
           1060             60                     1
           1061             61                     1
           1062             62                     1
           1063             63                     1
           1064             64                     1
           1065             65                     1
           1066             66                     1
           1067             67                     1
           1068             68                     1
           1069             69                     1
           1070             70                     1
           1071             71                     1
           1072             72                     1
           1073             73                     1
           1074             74                     1
           1075             75                     1
           1076             76                     1
           1077             77                     1
           1078             78                     1
           1079             79                     1
           1080             80                     1
           1081             81                     1
           1082             82                     1
           1083             83                     1
           1084             84                     1
           1085             85                     1
           1086             86                     1
           1087             87                     1
           1088             88                     1
           1089             89                     1
           1090             90                     1
           1091             91                     1
           1092             92                     1
           1093             93                     1
           1094             94                     1
           1095             95                     1
           1096             96                     1
           1097             97                     1
           1098             98                     1
           1099             99                     1
           1100            100                     1
           1101            101                     1
           1102            102                     1
           1103            103                     1
           1104            104                     1
           1105            105                     1
           1106            106                     1
           1107            107                     1
           1108            108                     1
           1109            109                     1
           1110            110                     1
           1111            111                     1
           1112            112                     1
           1113            113                     1
           1114            114                     1
           1115            115                     1
           1116            116                     1
           1117            117                     1
           1118            118                     1
           1119            119                     1
           1120            120                     1
           1121            121                     1
           1122            122                     1
           1123            123                     1
           1124            124                     1
           1125            125                     1
           1126            126                     1
           1127            127                     1
           1128            128                     1
           1129            129                     1
           1130            130                     1
           1131            131                     1
           1132            132                     1
           1133            133                     1
           1134            134                     1
           1135            135                     1
           1136            136                     1
           1137            137                     1
           1138            138                     1
           1139            139                     1
           1140            140                     1
           1141            141                     1
           1142            142                     1
           1143            143                     1
           1144            144                     1
           1145            145                     1
           1146            146                     1
           1147            147                     1
           1148            148                     1
           1149            149                     1
           1150            150                     1
           1151            151                     1
           1152            152                     1
           1153            153                     1
           1154            154                     1
           1155            155                     1
           1156            156                     1
           1157            157                     1
           1158            158                     1
           1159            159                     1
           1160            160                     1
           1161            161                     1
           1162            162                     1
           1163            163                     1
           1164            164                     1
           1165            165                     1
           1166            166                     1
           1167            167                     1
           1168            168                     1
           1169            169                     1
           1170            170                     1
           1171            171                     1
           1172            172                     1
           1173            173                     1
           1174            174                     1
           1175            175                     1
           1176            176                     1
           1177            177                     1
           1178            178                     1
           1179            179                     1
           1180            180                     1
           1181            181                     1
           1182            182                     1
           1183            183                     1
           1184            184                     1
           1185            185                     1
           1186            186                     1
           1187            187                     1
           1188            188                     1
           1189            189                     1
           1190            190                     1
           1191            191                     1
           1192            192                     1
           1193            193                     1
           1194            194                     1
           1195            195                     1
           1196            196                     1
           1197            197                     1
           1198            198                     1
           4111           9999                  1000

200 rows selected.

HEIGHT BALANCED
ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_REPEAT_COUNT
--------------- -------------- ---------------------
             48              0                     0
             49             16                     0
             50             36                     0
             51             57                     0
             52             77                     0
             53             98                     0
             54            118                     0
             55            139                     0
             56            159                     0
             57            180                     0
             58            200                     0
             59            221                     0
             60            241                     0
             61            262                     0
             62            282                     0
             63            303                     0
             64            323                     0
             65            344                     0
             66            364                     0
             67            385                     0
             68            405                     0
             69            426                     0
             70            446                     0
             71            467                     0
             72            487                     0
             73            508                     0
             74            528                     0
             75            549                     0
             76            569                     0
             77            590                     0
             78            610                     0
             79            631                     0
             80            651                     0
             81            672                     0
             82            692                     0
             83            713                     0
             84            733                     0
             85            754                     0
             86            774                     0
             87            795                     0
             88            815                     0
             89            836                     0
             90            856                     0
             91            877                     0
             92            897                     0
             93            918                     0
             94            938                     0
             95            959                     0
             96            979                     0
             97           1000                     0
            151           1111                     0
            200           9999                     0

52 rows selected.


12.2
10 июн 21, 01:55    [22333563]     Ответить | Цитировать Сообщить модератору
 Re: Hybrid Histograms  [new]
Timur Akhmadeev
Member

Откуда:
Сообщений: 516
На 19.10 все хорошо
+
HISTOGRAM
---------------
HYBRID

ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_REPEAT_COUNT
--------------- -------------- ---------------------
           1000              0                  1000
           1005              5                     1
           1010             10                     1
           1015             15                     1

...
           1989            989                     1
           1995            995                     1
           2000           1000                     1
           3111           1111                  1111
           4111           9999                  1000

200 rows selected.
10 июн 21, 12:50    [22333718]     Ответить | Цитировать Сообщить модератору
 Re: Hybrid Histograms  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 866
Timur Akhmadeev,

Это обнадежиавет. На 12.1 и 12.2 одинаково плохо.

Посмотрим как дела на 21с. У Оракла остается 3 недели, чтоб сделать его доступным для загрузки если релиз 1HCY2021.
10 июн 21, 19:06    [22334064]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить