oracle database 12c - histogramas · 103.5 4 111 1 3 rows selected. ... • combina...
TRANSCRIPT
© 2016 IBM Corporation
Oracle Database 12c
© 2015 IBM Corporation
Oracle Database 12c - HistogramasGaston Aprile
Mail to: [email protected]
© 2016 IBM Corporation
Oracle Database 12c
Contenido
• Performance
• Que son las estadísticas?
• Que son los Histogramas?
• Tipos de Histogramas
• Como calcularlos?
• Cuando usamos Histogramas?
18 November 2016 2
© 2016 IBM Corporation
Oracle Database 12c
“Si una consulta tarda 15 horas… la consulta no es performante?”
El objetivo es comprender porque son 15 horas
18 November 2016 3
© 2016 IBM Corporation
Oracle Database 12c
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
© 2016 IBM Corporation
Oracle Database 12c
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.
18 November 2016 5
Buckets 254 (11.2) / 2048 pero con 254 default (en 12.1)
© 2016 IBM Corporation
Oracle Database 12c
Tipos de Histogramas
• Frecuency (pre-12c)
• Height-Balanced (pre-12c)
• Top Frecuency (nuevo en 12c)
• Hybrid (nuevo en 12c)
18 November 2016 6
© 2016 IBM Corporation
Oracle Database 12c
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
© 2016 IBM Corporation
Oracle Database 12c
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 185105 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 8102 33 25
103 101 68
104 286 185
105 788 502
106 1000 212
6 rows selected.
18 November 2016 8
Buckets
Es la cantidad de
valores en el
Bucket
Nombre del Bucket
© 2016 IBM Corporation
Oracle Database 12c
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
© 2016 IBM Corporation
Oracle Database 12c
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 1103.5 4111 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
© 2016 IBM Corporation
Oracle Database 12c
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 cantidadde registros.
18 November 2016 11
© 2016 IBM Corporation
Oracle Database 12c
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
© 2016 IBM Corporation
Oracle Database 12c
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 51053SH 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 51062SH 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 51080SH 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
18 November 2016 13
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)
© 2016 IBM Corporation
Oracle Database 12c
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
© 2016 IBM Corporation
Oracle Database 12c
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
© 2016 IBM Corporation
Oracle Database 12c
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
© 2016 IBM Corporation
Oracle Database 12c
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
© 2016 IBM Corporation
Oracle Database 12c
Tipos de Histogramas - Top Frecuency (nuevo en 12c)
set linesize 220 pages 1000col owner format a6col table_name format a10col column_name format a20select 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 JumpsFROM dba_tab_histogramsWHERE 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 ValueSYSTEM TABLA3 REGISTRO 2213 2 1149 Popular ValueSYSTEM TABLA3 REGISTRO 3320 3 1107 Popular ValueSYSTEM TABLA3 REGISTRO 4510 4 1190 Popular ValueSYSTEM TABLA3 REGISTRO 5638 5 1128 Popular ValueSYSTEM TABLA3 REGISTRO 6678 6 1040 Popular ValueSYSTEM TABLA3 REGISTRO 7816 7 1138 Popular ValueSYSTEM TABLA3 REGISTRO 8899 8 1083 Popular ValueSYSTEM TABLA3 REGISTRO 9990 9 1091 Popular ValueSYSTEM TABLA3 REGISTRO 9991 10000 1 Non-popular Value
10 rows selected.
SQL>
18 November 2016 18
© 2016 IBM Corporation
Oracle Database 12c
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
© 2016 IBM Corporation
Oracle Database 12c
Tipos de Histogramas - Hybrid (nuevo en 12c)
set linesize 220 pages 1000col owner format a6col table_name format a10col column_name format a20select owner, table_name, column_name, endpoint_value, endpoint_number, endpoint_repeat_countfrom dba_tab_histogramsWHERE 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 47SYSTEM TABLA4 REGISTRO 2 102 55SYSTEM TABLA4 REGISTRO 3 148 46SYSTEM TABLA4 REGISTRO 4 188 40SYSTEM TABLA4 REGISTRO 5 240 52SYSTEM TABLA4 REGISTRO 6 314 74SYSTEM TABLA4 REGISTRO 7 361 47SYSTEM TABLA4 REGISTRO 8 415 54SYSTEM TABLA4 REGISTRO 9 470 55SYSTEM TABLA4 REGISTRO 10 511 41SYSTEM TABLA4 REGISTRO 11 575 64SYSTEM TABLA4 REGISTRO 12 629 54SYSTEM TABLA4 REGISTRO 13 675 46SYSTEM TABLA4 REGISTRO 14 723 48SYSTEM TABLA4 REGISTRO 15 769 46SYSTEM TABLA4 REGISTRO 16 810 41SYSTEM TABLA4 REGISTRO 17 878 68SYSTEM TABLA4 REGISTRO 18 934 56SYSTEM TABLA4 REGISTRO 19 975 41SYSTEM TABLA4 REGISTRO 20 1030 55SYSTEM TABLA4 REGISTRO 21 1077 47SYSTEM TABLA4 REGISTRO 22 1131 54SYSTEM TABLA4 REGISTRO 23 1177 46……
18 November 2016 20
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
…La información que tiene el Histograma Hibrido es mas completa en comparación
con el Histograma Balanceado
© 2016 IBM Corporation
Oracle Database 12c
Como calcularlos?
• FOR ALL COLUMNS SIZE AUTO � Generara histogramas para toda columna que detecte que los datos no son “Uniformes”
• FOR ALL COLUMNS SIZE REPEAT� Re-Generara los histogramas para las columnasque ya tenga histogramas generados previamente
• METHOD_OPT=>'FOR COLUMNS REGISTRO SIZE 10’ � Le indicamos que para la columna registro, genere 10 Buckets
• METHOD_OPT=>'FOR COLUMNS SIZE 1’ � Forzamos a la No generación de 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
© 2016 IBM Corporation
Oracle Database 12c
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