Ver Mensaje Individual
  #5 (permalink)  
Antiguo 16/08/2016, 20:27
eduar2083
 
Fecha de Ingreso: octubre-2014
Ubicación: Lima
Mensajes: 74
Antigüedad: 9 años, 6 meses
Puntos: 1
Respuesta: Consulta a tabla particionada

Hola de nuevo,
Primero mencionar que por error eliminé la imagen del primer link, se está mostrando la misma imagen en ambos links.

Cita:
Iniciado por huesos52 Ver Mensaje
El costo que mencionas, es el que pones en la imagen?
Porque lo veo supremamnete bajito para ser tablas con union y consultando una tabla particionada que asumo tiene millones de registros.
No, la data es de ambiente de desarrollo con unos pocos registros, la data de producción contiene un aproximado de 200 millones de registros por partición así que de seguro el costo se incrementa.

He realizado la consulta a otras particiones con mayor volumen de data. La consulta final en realidad tiene la siguiente forma:

SQL SIN HINTS
Código SQL:
Ver original
  1. SELECT
  2.     NVL(COL_A, -1) AS COL_A,
  3.     DM.FN_FORMATEAR_TEXT(COL_B) AS COL_B,
  4.     NVL(COL_C, -1) AS COL_C,
  5.     MAX(S_TIMESTAMP) CLOSING_TIME
  6. FROM (
  7.     SELECT
  8.         COL_A,
  9.         COL_B,
  10.         COL_C,
  11.         S_TIMESTAMP
  12.     FROM DM.CDR_GPRS PARTITION(P_20160702)
  13.     WHERE
  14.         S_TIMESTAMP > TO_DATE('20160701205959', 'YYYYMMDDHH24MISS')
  15.     UNION
  16.     SELECT
  17.         COL_A,
  18.         COL_B,
  19.         COL_C,
  20.         S_TIMESTAMP
  21.     FROM DM.CDR_GPRS PARTITION(P_20160703      )
  22.     UNION
  23.     SELECT
  24.         COL_A,
  25.         COL_B,
  26.         COL_C,
  27.         S_TIMESTAMP
  28.     FROM DM.CDR_GPRS PARTITION(P_20160704      )
  29.     UNION
  30.     SELECT
  31.         COL_A,
  32.         COL_B,
  33.         COL_C,
  34.         S_TIMESTAMP
  35.     FROM DM.CDR_GPRS PARTITION(P_20160705      )
  36.     UNION
  37.     SELECT
  38.         COL_A,
  39.         COL_B,
  40.         COL_C,
  41.         S_TIMESTAMP
  42.     FROM DM.CDR_GPRS PARTITION(P_20160706      )
  43.     UNION
  44.     SELECT
  45.         COL_A,
  46.         COL_B,
  47.         COL_C,
  48.         S_TIMESTAMP
  49.     FROM DM.CDR_GPRS PARTITION(P_20160707      )
  50.     UNION
  51.     SELECT
  52.         COL_A,
  53.         COL_B,
  54.         COL_C,
  55.         S_TIMESTAMP
  56.     FROM DM.CDR_GPRS PARTITION(P_20160708      )
  57.     UNION
  58.     SELECT
  59.         COL_A,
  60.         COL_B,
  61.         COL_C,
  62.         S_TIMESTAMP
  63.     FROM DM.CDR_GPRS PARTITION(P_20160709      )
  64.     UNION
  65.     SELECT
  66.         COL_A,
  67.         COL_B,
  68.         COL_C,
  69.         S_TIMESTAMP
  70.     FROM DM.CDR_GPRS PARTITION(P_20160710      )
  71.     UNION
  72.     SELECT
  73.         COL_A,
  74.         COL_B,
  75.         COL_C,
  76.         S_TIMESTAMP
  77.     FROM DM.CDR_GPRS PARTITION(P_20160711)
  78.     WHERE
  79.         S_TIMESTAMP <= TO_DATE('20160710205959', 'YYYYMMDDHH24MISS')
  80. )
  81. GROUP BY COL_A, COL_B, COL_C
  82. SIN_HINTS.SQL
  83. Abrir con Documentos de Google
  84. Mostrando SIN_HINTS.SQL.


SQL CON HINTS
Código SQL:
Ver original
  1. SELECT
  2.     NVL(COL_A, -1) AS COL_A,
  3.     DM.FN_FORMATEAR_TEXT(COL_B) AS COL_B,
  4.     NVL(COL_C, -1) AS COL_C,
  5.     MAX(S_TIMESTAMP) CLOSING_TIME
  6. FROM (
  7.     SELECT
  8.         COL_A,
  9.         COL_B,
  10.         COL_C,
  11.         S_TIMESTAMP
  12.     FROM DM.CDR_GPRS PARTITION(P_20160702) A
  13.     WHERE
  14.         S_TIMESTAMP > TO_DATE('20160701205959', 'YYYYMMDDHH24MISS')
  15.     UNION
  16.     SELECT /*+ INDEX(B IDX_GPRS_S_TIMESTAMP)*/
  17.         COL_A,
  18.         COL_B,
  19.         COL_C,
  20.         S_TIMESTAMP
  21.     FROM DM.CDR_GPRS PARTITION(P_20160703      ) B
  22.     UNION
  23.     SELECT /*+ INDEX(C IDX_GPRS_S_TIMESTAMP)*/
  24.         COL_A,
  25.         COL_B,
  26.         COL_C,
  27.         S_TIMESTAMP
  28.     FROM DM.CDR_GPRS PARTITION(P_20160704      ) C
  29.     UNION
  30.     SELECT /*+ INDEX(D IDX_GPRS_S_TIMESTAMP)*/
  31.         COL_A,
  32.         COL_B,
  33.         COL_C,
  34.         S_TIMESTAMP
  35.     FROM DM.CDR_GPRS PARTITION(P_20160705      ) D
  36.     UNION
  37.     SELECT /*+ INDEX(E IDX_GPRS_S_TIMESTAMP)*/
  38.         COL_A,
  39.         COL_B,
  40.         COL_C,
  41.         S_TIMESTAMP
  42.     FROM DM.CDR_GPRS PARTITION(P_20160706      ) E
  43.     UNION
  44.     SELECT /*+ INDEX(F IDX_GPRS_S_TIMESTAMP)*/
  45.         COL_A,
  46.         COL_B,
  47.         COL_C,
  48.         S_TIMESTAMP
  49.     FROM DM.CDR_GPRS PARTITION(P_20160707      ) F
  50.     UNION
  51.     SELECT /*+ INDEX(G IDX_GPRS_S_TIMESTAMP)*/
  52.         COL_A,
  53.         COL_B,
  54.         COL_C,
  55.         S_TIMESTAMP
  56.     FROM DM.CDR_GPRS PARTITION(P_20160708      ) G
  57.     UNION
  58.     SELECT /*+ INDEX(H IDX_GPRS_S_TIMESTAMP)*/
  59.         COL_A,
  60.         COL_B,
  61.         COL_C,
  62.         S_TIMESTAMP
  63.     FROM DM.CDR_GPRS PARTITION(P_20160709      ) H
  64.     UNION
  65.     SELECT /*+ INDEX(I IDX_GPRS_S_TIMESTAMP)*/
  66.         COL_A,
  67.         COL_B,
  68.         COL_C,
  69.         S_TIMESTAMP
  70.     FROM DM.CDR_GPRS PARTITION(P_20160710      ) I
  71.     UNION
  72.     SELECT /*+ INDEX(J IDX_GPRS_S_TIMESTAMP)*/
  73.         COL_A,
  74.         COL_B,
  75.         COL_C,
  76.         S_TIMESTAMP
  77.     FROM DM.CDR_GPRS PARTITION(P_20160711) J
  78.     WHERE
  79.         S_TIMESTAMP <= TO_DATE('20160710205959', 'YYYYMMDDHH24MISS')
  80. )
  81. GROUP BY COL_A, COL_B, COL_C
  82. CON_HINTS.SQL
  83. Abrir con Documentos de Google
  84. Mostrando CON_HINTS.SQL.
  85. Guardando en Drive - Mover a:

COSTO CON HINTS:
https://drive.google.com/open?id=0B9...VpNlBLc0E3N0ZJ

Mi duda es si la consulta está optimizada o se podría mejorar,

Muchas gracias, saludos.

Última edición por eduar2083; 16/08/2016 a las 20:33