Oracle Database 12c - Histogramas Gaston Aprile Mail to: gaaprile@cl.ibm.com gasaprile@gmail.com 2016 2015 IBM Corporation
Contenido Performance Que son las estadísticas? Que son los Histogramas? Tipos de Histogramas Como calcularlos? Cuando usamos Histogramas? 18 November 2016 2
Si una consulta tarda 15 horas la consulta no es performante? El objetivo es comprender porque son 15 horas 18 November 2016 3
Que son las estadísticas? La estadística es información que colecta la Base de Datos relacionada a los objetos y por la cual el optimizador toma sus decisiones al momento de la ejecución de consultas. 18 November 2016 4
Que son los Histogramas? Son datos estadísticos que reflejan la distribución de la información dentro de una tabla. Esto quiere decir, conoce como es la distribución de los datos dentro de los campos de la tabla. Buckets 254 (11.2)/ 2048 pero con 254 default (en 12.1) 18 November 2016 5
Tipos de Histogramas Frecuency (pre-12c) Height-Balanced (pre-12c) Top Frecuency (nuevo en 12c) Hybrid (nuevo en 12c) 18 November 2016 6
Tipos de Histogramas - Frecuency (pre-12c) El número de Buckets es igual al número de Distinct Values El End_Point_Number es el número del Bucket. Representa el valor numérico en sí acumulado de la frecuencia. El End_Point_Value muestra una representación numérica del valor en sí del número del Bucket. En el caso de valores no-numéricos, los valores de los histogramas se transforman a un valor numérico. 18 November 2016 7
Tipos de Histogramas - Frecuency (pre-12c) SQL> set linesize 220 pages 10000 SQL> select valor2, count(1) from table group by valor2 order by valor2; VALOR2 COUNT(1) ---------- ---------- 101 8 102 25 103 68 104 185 105 502 106 212 6 rows selected. SQL> SELECT endpoint_value, endpoint_number, endpoint_number - LAG(endpoint_number, 1, 0) OVER (ORDER BY endpoint_value) AS frequency FROM user_tab_histograms WHERE table_name = 'TABLA' AND column_name = 'VALOR2' ORDER BY endpoint_value; ENDPOINT_VALUE ENDPOINT_NUMBER FREQUENCY -------------- --------------- ---------- 101 8 8 102 33 25 103 101 68 104 286 185 105 788 502 106 1000 212 Nombre del Bucket Es la cantidad de valores en el Bucket Buckets 6 rows selected. 18 November 2016 8
Tipos de Histogramas - Frecuency (pre-12c) explain plan set statement_id '101' for select * from tabla where valor2 = 101; explain plan set statement_id '102' for select * from tabla where valor2 = 102; explain plan set statement_id '103' for select * from tabla where valor2 = 103; explain plan set statement_id '104' for select * from tabla where valor2 = 104; explain plan set statement_id '105' for select * from tabla where valor2 = 105; explain plan set statement_id '106' for select * from tabla where valor2 = 106; select statement_id, cardinality from plan_table where id = 0; STATEMENT_ID CARDINALITY ------------------------------ ----------- 101 8 102 25 103 68 104 185 105 502 106 212 6 rows selected. explain plan set statement_id '105' for select * from tabla where valor2 = 105; --------------------------------------------------------------------------- Id Operation Name Rows Bytes Cost (%CPU) Time --------------------------------------------------------------------------- 0 SELECT STATEMENT 502 130K 12 (0) 00:00:01 * 1 TABLE ACCESS FULL TABLA 502 130K 12 (0) 00:00:01 --------------------------------------------------------------------------- 18 November 2016 9
Tipos de Histogramas - Frecuency (pre-12c) Que pasa cuando el valor2 no existe en el histograma? explain plan set statement_id '090' for select * from tabla where valor2 = 90; explain plan set statement_id '103.5' for select * from tabla where valor2 = 103.5; explain plan set statement_id '111' for select * from tabla where valor2 = 111; select statement_id, cardinality from plan_table where id = 0; STATEMENT_ID CARDINALITY ------------------------------ ----------- 090 1 103.5 4 111 1 3 rows selected. Si el valor está entre el mínimo y el máximo el optimizador toma el histograma con menor valor y lo divide por 2. En nuestro caso el Bucket 101 tiene 8 valores, por la cual la cardinalidad es 4 Si el valor esta fuera del mínimo y el máximo dependerá de la distancia entre el mínimo valor y el máximo valor respecto a la frecuencia 18 November 2016 10
Tipos de Histogramas - Height-Balanced (pre-12c) La cantidad de Buckets es menor a la cantidad de Distinct Values Se agrega el Bucket 0 para indicar el valor mínimo de los histogramas El Endpoint_Value intenta representar el valor de la columna dentro del Histograma El Endpoint_Number muestra el número del Bucket Cada Bucket representa un rango de valores que contienen aproximadamente la misma cantidad de registros. 18 November 2016 11
Tipos de Histogramas - Height-Balanced (pre-12c) SQL> exec dbms_stats.gather_table_stats( ownname => 'SH', tabname => 'CUSTOMERS', estimate_percent => 100,method_opt => 'FOR ALL COLUMNS SIZE 254',cascade => true); SQL> select count(distinct CUST_CITY_ID) from sh.customers group by 1; COUNT(DISTINCTCUST_CITY_ID) --------------------------- 620 SQL> SELECT count(1) FROM dba_tab_histograms WHERE owner = 'SH' and table_name = 'CUSTOMERS' AND column_name = 'CUST_CITY_ID'; COUNT(1) ---------- 212 18 November 2016 12
Tipos de Histogramas - Height-Balanced (pre-12c) SELECT owner, table_name, column_name, endpoint_number, endpoint_value FROM dba_tab_histograms WHERE owner = 'SH' and table_name = 'CUSTOMERS' AND column_name = 'CUST_CITY_ID' ORDER BY endpoint_value; OWNER TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE ----- ---------- -------------------- --------------- -------------- SH CUSTOMERS CUST_CITY_ID 0 51040 SH CUSTOMERS CUST_CITY_ID 1 51043 SH CUSTOMERS CUST_CITY_ID 2 51044 SH CUSTOMERS CUST_CITY_ID 3 51046 SH CUSTOMERS CUST_CITY_ID 4 51049 SH CUSTOMERS CUST_CITY_ID 5 51053 SH CUSTOMERS CUST_CITY_ID 6 51055 SH CUSTOMERS CUST_CITY_ID 7 51057 SH CUSTOMERS CUST_CITY_ID 8 51059 SH CUSTOMERS CUST_CITY_ID 9 51061 SH CUSTOMERS CUST_CITY_ID 10 51062 SH CUSTOMERS CUST_CITY_ID 11 51067 SH CUSTOMERS CUST_CITY_ID 14 51069 SH CUSTOMERS CUST_CITY_ID 15 51073 SH CUSTOMERS CUST_CITY_ID 17 51075 SH CUSTOMERS CUST_CITY_ID 18 51078 SH CUSTOMERS CUST_CITY_ID 19 51080 SH CUSTOMERS CUST_CITY_ID 20 51153 SH CUSTOMERS CUST_CITY_ID 21 51158 SH CUSTOMERS CUST_CITY_ID 22 51162 SH CUSTOMERS CUST_CITY_ID 23 51164 SH CUSTOMERS CUST_CITY_ID 25 51166 SH CUSTOMERS CUST_CITY_ID 26 51170 select CUST_CITY_ID, count(1) from sh.customers where CUST_CITY_ID between 51044 and 51046 group by CUST_CITY_ID order by 2 desc; CUST_CITY_ID COUNT(1) ------------ ---------- 51044 145 51045 158 51046 25 Un Bucket puede contener mas de un Distinct Value (2 vs 3) 18 November 2016 13
Tipos de Histogramas - Height-Balanced (pre-12c) El siguiente ejemplo es la estimación realizada por el optimizador cuando se utilizan Histogramas Heigth-Balance: explain plan set statement_id 'C52372' for select * from sh.customers where CUST_CITY_ID = 52372; Tiene 16 registros explain plan set statement_id 'C52374' for select * from sh.customers where CUST_CITY_ID = 52374; Tiene 238 registros explain plan set statement_id 'C51806' for select * from sh.customers where CUST_CITY_ID = 51806; Tiene 932 registros STATEMENT_ID CARDINALITY ------------------------------ ----------- C52372 66 C52374 66 C51806 874 18 November 2016 14
Tipos de Histogramas - Height-Balanced (pre-12c) El gran problema con los Histogramas Balanceados es que un cambio en la distribución de los datos dentro de la columna, puede dar lugar a que un Valor pase a ser Popular por la cual la estimación de la Cardinalidad en el cálculo del plan de ejecución cambia rotundamente: SQL> col owner format a5 col table_name format a10 col column_name format a20 select owner, table_name, column_name, endpoint_number, endpoint_value, Jumps, decode(jumps,1, 'Non-popular Value','Popular Value') as popular from ( SELECT owner, table_name, column_name, endpoint_number, endpoint_value,endpoint_number - LAG(endpoint_number, 1, 0) OVER (ORDER BY endpoint_value) AS Jumps FROM dba_tab_histograms WHERE owner = 'SH' and table_name = 'CUSTOMERS' AND column_name = 'CUST_CITY_ID' ORDER BY endpoint_value) where endpoint_value in (51806, 52372, 52374) order by endpoint_value; OWNER TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE JUMPS POPULAR ----- ---------- ------------- --------------- -------------- ------ ------------- SH CUSTOMERS CUST_CITY_ID 142 51806 4 Popular Value (numrows_tabla)*(num_de_endpoints_del_valor/total_endpoints) SH CUSTOMERS CUST_CITY_ID 228 52374 1 Non-popular Value (numrows_tabla) * density 0 +certero y 1 certero (La densidad se puede ver en la vista DBA_TAB_COLUMNS) 18 November 2016 15
Tipos de Histogramas - Top Frecuency (nuevo en 12c) Se basan en los Histogramas Frecuencia Para que los Top-Frecuency sean útiles, el numero de valores Populares tiene que ser al mayor o igual al número de Buckets generados, cuando los valores No-Populares tienden a ser descartados El % de registros Populares tiene que ser mayor al % P -> (1-(1/n))*100, donde n es el número de Buckets 18 November 2016 16
Tipos de Histogramas - Top Frecuency (nuevo en 12c) SQL> select registro, count(1) from tabla3 group by registro order by 1; REGISTRO COUNT(1) ---------- ---------- 1 1064 2 1149 3 1107 4 1190 5 1128 6 1040 7 1138 8 1083 9 1091 9991 1 9992 1 9993 1 9994 1 9995 1 9996 1 9997 1 9998 1 9999 1 10000 1 19 rows selected. 18 November 2016 17
Tipos de Histogramas - Top Frecuency (nuevo en 12c) set linesize 220 pages 1000 col owner format a6 col table_name format a10 col column_name format a20 select owner, table_name, column_name, endpoint_number, endpoint_value, Jumps, decode(jumps,1,'non-popular Value','Popular Value') as Popular from ( SELECT owner, table_name, column_name, endpoint_number, endpoint_value,endpoint_number - LAG(endpoint_number, 1, 0) OVER (ORDER BY endpoint_value) AS Jumps FROM dba_tab_histograms WHERE owner = 'SYSTEM' and table_name = 'TABLA3' AND column_name = 'REGISTRO' ORDER BY endpoint_value) order by endpoint_value; OWNER TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE JUMPS POPULAR ------ ---------- -------------------- --------------- -------------- ---------- ----------------- SYSTEM TABLA3 REGISTRO 1064 1 1064 Popular Value SYSTEM TABLA3 REGISTRO 2213 2 1149 Popular Value SYSTEM TABLA3 REGISTRO 3320 3 1107 Popular Value SYSTEM TABLA3 REGISTRO 4510 4 1190 Popular Value SYSTEM TABLA3 REGISTRO 5638 5 1128 Popular Value SYSTEM TABLA3 REGISTRO 6678 6 1040 Popular Value SYSTEM TABLA3 REGISTRO 7816 7 1138 Popular Value SYSTEM TABLA3 REGISTRO 8899 8 1083 Popular Value SYSTEM TABLA3 REGISTRO 9990 9 1091 Popular Value SYSTEM TABLA3 REGISTRO 9991 10000 1 Non-popular Value 10 rows selected. SQL> 18 November 2016 18
Tipos de Histogramas - Hybrid (nuevo en 12c) Combina características de los Histogramas de Frecuencia y los Balanceados Cada Distinct Value es asociado a un Bucket. El concepto de Popular Value no existe Por lo tanto, cada Bucket tiene un número distinto de registros Oracle 12c tiende a utilizar los Histogramas Híbridos en lugar a los Balanceados Agrega el concepto de Endpoint_repeat_count que indica la cantidad de veces que un Endpoint_value se repite dentro del Bucket 18 November 2016 19
Tipos de Histogramas - Hybrid (nuevo en 12c) set linesize 220 pages 1000 col owner format a6 col table_name format a10 col column_name format a20 select owner, table_name, column_name, endpoint_value, endpoint_number, endpoint_repeat_count from dba_tab_histograms WHERE owner = 'SYSTEM' and table_name = 'TABLA4' AND column_name = 'REGISTRO'; OWNER TABLE_NAME COLUMN_NAME ENDPOINT_VALUE ENDPOINT_NUMBER ENDPOINT_REPEAT_COUNT ------ ---------- ----------------- -------------- --------------- --------------------- SYSTEM TABLA4 REGISTRO 1 47 47 SYSTEM TABLA4 REGISTRO 2 102 55 SYSTEM TABLA4 REGISTRO 3 148 46 SYSTEM TABLA4 REGISTRO 4 188 40 SYSTEM TABLA4 REGISTRO 5 240 52 SYSTEM TABLA4 REGISTRO 6 314 74 SYSTEM TABLA4 REGISTRO 7 361 47 SYSTEM TABLA4 REGISTRO 8 415 54 SYSTEM TABLA4 REGISTRO 9 470 55 SYSTEM TABLA4 REGISTRO 10 511 41 SYSTEM TABLA4 REGISTRO 11 575 64 SYSTEM TABLA4 REGISTRO 12 629 54 SYSTEM TABLA4 REGISTRO 13 675 46 SYSTEM TABLA4 REGISTRO 14 723 48 SYSTEM TABLA4 REGISTRO 15 769 46 SYSTEM TABLA4 REGISTRO 16 810 41 SYSTEM TABLA4 REGISTRO 17 878 68 SYSTEM TABLA4 REGISTRO 18 934 56 SYSTEM TABLA4 REGISTRO 19 975 41 SYSTEM TABLA4 REGISTRO 20 1030 55 SYSTEM TABLA4 REGISTRO 21 1077 47 SYSTEM TABLA4 REGISTRO 22 1131 54 SYSTEM TABLA4 REGISTRO 23 1177 46 La información que tiene el Histograma Hibrido es mas completa en comparación con el Histograma Balanceado SQL> select * from ( select registro, count(1) from tabla4 group by registro order by 1) REGISTRO COUNT(1) ---------- ---------- 1 47 2 55 3 46 4 40 5 52 6 74 7 47 8 54 9 55 10 41 11 64 12 54 13 46 14 48 15 46 16 41 17 68 18 56 19 41 20 55 18 November 2016 20
Como calcularlos? FOR ALL COLUMNS SIZE AUTO Generarahistogramaspara todacolumnaque detecte que los datos no son Uniformes FOR ALL COLUMNS SIZE REPEAT Re-Generara los histogramas para las columnas que ya tenga histogramas generados previamente METHOD_OPT=>'FOR COLUMNS REGISTRO SIZE 10 Le indicamosque para la columna registro, genere 10 Buckets METHOD_OPT=>'FOR COLUMNS SIZE 1 Forzamosa la No generaciónde Histogramas La información de como se utilizan las columnas se encuentra en la vista SYS.COL_USAGE$. La próxima vez que se generen estadísticas, el paquete DBMS_STATS consultará la vista y determinará si se necesitan histogramas. Si la tabla nunca se uso, nunca habrá información en la COL_USAGE$. 18 November 2016 21
Cuando usamos Histogramas? SI tener Histogramas En columnas que aparecen en el Where de Querys En columnas donde la distribución no es uniforme No tener Histogramas Cuando en el Where se utilizan Binds La información en la columna esta distribuida de manera uniforma En columnas donde no aparecen en los Where de Querys En columnas Unique 18 November 2016 22
18 November 2016 23