Caracteristicas Avanzadas SQL

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 41

Afinamiento SQL y PL/SQL para Desarrolladores

Características Avanzadas SQL


Introducción

•  Aplicaciones  actuales  demandan  menores  1empos  de  


respuesta  de  las  bases  de  datos  
•  Sentencias  SQL  eficientes  son  necesarias  para  cumplir  
SLAs  
–  Fracción  de  un  segundo  para  transacciones  en  línea  
–  Menos  de  un  segundo  para  operaciones  gráficas  
–  Pocos  segundos  para  reportes  en  línea    
•  Obtener    el  mejor  rendimiento  a  medida  que  incrementa  
el  número  de  usuarios  no  es  una  tarea  sencilla  

§ 2
El Problema ?

•  Programadores  u1lizan  caracterís1cas  an1guas  


de  SQL  
•  Sentencias  tradicionales  ‘SELECT’  con  sub  queries  
y  tablas  intermedias  o  de  paso  
•  Afinamiento  adicional  requerido  para  escalar  
•  Múl1ples  copias  de  SQL  ineficientes  pueden  
afectar  el  rendimiento  del  sistema  
 

§ 3
La Solución

•  Potenciar  su  SQL  


•  Caracterís1cas  que  ayudan  a  resolver  la  mayoría  
de  problemas  de  SQL  
•  Procesamiento  más  rápido  con  las  nuevas  
caracterís1cas  SQL  
•  Funciones  avanzadas  de  SQL  que  no  necesitan  
Afinamiento  
 
 

§ 4
Construcción  1:  Cláusula  With  en  SQL  
•  With  Clause  en  sentencias  Select  
WITH      
–  Sólo  se  puede  usar  en  sentencias  
         query_name1(alias11,  alias12,..)  AS  
SELECT  
         (Select  subquery1)  
–  Datos  pre-­‐construidos  para  una  
         query_name2  (alias21,  alias22,..)  AS  
consulta  compleja  
           (Select  subquery2)  
–  Crea  y  trabaja  en  un  conjunto  de        SELECT  col1,  col2,..  
resultados          FROM  query_name1,  query_name2  
–  Referencia  el  conjunto  de          WHERE  <join  condi1on>;  
resultados  varias  veces  
 
  §  Beneficios  
–  Eliminar  tablas  de  paso  y  escrituras  relacionadas  
–  Excelente  alterna1va  a  tablas  temporales  globales  
–  Mejora  el  rendimiento    
–  Usado  en  consultas  adhoc  en  grandes  bases  de  datos  

§ 5
Construcción  1:  Cláusula  With  en  SQL  
WITH a1 AS – definir subquery, salario por departamento y job type
( select department_id,job_title,sum(salary) salary
from employees, jobs
where a.job_id=b.job_id
group by department_id,job_title),
b1 AS -- definir subquery, departamentos y sus países
(select department_id, country_name
from departments a, locations b, countries c
where a.location_id=b.location_id
and b.country_id=c.country_id)
SELECT country_name, job_title, sum(salary) -- seleccionar a partir de los resultados
FROM a1, b1
WHERE a1.department_id=b1.department_id
GROUP BY country_name, job_title  

§ 6
Construcción  1:  Cláusula  With  en  SQL  

•  Cláusula  With  Recursiva   WITH emp(first_name, employee_id,job_title,


–  With  anidado   managers_name) AS
(
–  Reutliza  el  conjunto   Select first_name, employee_id,job_title,' '
de  resultados  en  un   from employees a, jobs b
where a.job_id=b.job_id
nested  loop   and b.job_id='AD_PRES'
•  Beneficios:   UNION ALL
Select first_name,a.employee_id,b.job_title,
–  Menor  I/Os     c.first_name managers_name
–  Rendimiento  extremo   from employees a, jobs b, emp c
where a.job_id=b.job_id
and a.manager_id=c.employee_id
)
SELECT first_name employee_name, job_title,
  managers_name
FROM emp  

§ 7
Construcción  1:  Cláusula  With  en  SQL  

§ 8
Construcción  1:  Cláusula  With  en  
SQL    
Matriz de Compatibilidad

CaracterísEca   Oracle  version  

  With  clause   9i  y  superior  


Recursive   11gR2  únicamente  
With  clause  

Valor agregado para diferentes ambientes


OLTP   DSS/ReporEng   Data  
Warehouse  
No   Sí   Sí  

§ 9
Construcción  2:  Insert    MulEtabla  
•  Insert  Mul1-­‐tabla   INSERT ALL
INTO TABLE1 (values….)
–  Inserta  datos  en  muchas  tablas  
INTO TABLE2 (values…)
a  la  vez  
INTO TABLE3 (values…)
–  Insert  condicionales   SELECT col1, col2,..
•  Beneficios   FROM table1, table2, …
–  En  una  sola  sentencia  inserta   WHERE <join condition>;
 
los  datos  actuales,  de  auditoria  
INSERT  ALL    
e  históricos  
WHEN  <condiEon>  THEN    
–  Una  sola  pasada  al  compilador            INTO  TABLE1  (values..)  
–  Mejora  al  menos  50%  el   WHEN <condition> THEN
rendimiento  dependiendo  del   INTO TABLE2 (values..)
número  de  tablas   SELECT  col1,  col2,..  
FROM table1, table2, …  
       WHERE  <join  condi1on>;  
   
 

  § 10
Construcción  2:  Insert    MulEtabla  
INSERT ALL -- Inserta en 3 tablas condicionalmente
WHEN (SALARY >15000) THEN
INTO EMP_HIGH_SALARY
WHEN (SALARY>5000 AND SALARY<=15000) THEN
INTO EMP_MED_SALARY
ELSE
INTO EMP_LOW_SALARY
SELECT * FROM EMPLOYEES;

INSERT ALL --Inserta al mismo tiempo en tabla actual e histórica


INTO EMPLOYEE_SALARY(employee_id,first_name,last_name,salary)
VALUES (employee_id,first_name,last_name,salary)
INTO EMPLOYEE_SALARY_HISTORY(employee_id,first_name,last_name,salary,
update_date)
VALUES (employee_id,first_name,last_name,salary, update_date)
SELECT employee_id, first_name, last_name, salary, sysdate update_date
FROM EMPLOYEES;

§ 11
CaracterísEca  2:  Insert    MulEtabla  
Matriz de Compatibilidad

CaracterísEca   Oracle  version  


Mul1-­‐table  Inserts   9i  y  superior  
Condi1onal  Insert   10g  y  superior  

Valor agregado para diferentes ambientes

OLTP   DSS/ReporEng   Data  


Warehouse  
Sí   Sí   Sí*  

* No puede paralelizarse en tablas con bitmap indexes o index organized tables

§ 12
CaracterísEca  3:  Funciones  AnalíEcas  
Avanzadas    
•  Funciones  Analí1cas  
–  Comparar  filas  dentro  de  la  
misma  tabla  o  result  set   SELECT  
–  Aplicar  par1ciones  y  ventanas   analyEc_funcEon(arg1)    
para  la  comparación              over  (parEEon  by  expr  -­‐-­‐par%%on  clause  
–  Rangos  y  percen1les,  Análisis              order  by  expr  )                            -­‐-­‐order  by  clause  
Primero/Ul1mo,  Análisis  lag/            rows  between  <rows>    -­‐-­‐  windowing  clause  
lead     FROM table1, table2, . . .
–  Top-­‐N,  Movimientos  agregados   WHERE <join condition>;
•  Beneficios  
–  Elimina  los  self  joins    
–  Mejora  el  rendimiento  
–  Más  fácil  de  codificar  
–  No  requiere  afinamiento!  
 

§ 13
CaracterísEca  3:  Funciones  AnalíEcas  Avanzadas    

§ Sintaxis
§ Analytic-Function(<Argument>,<Argument>,...)
OVER (
<Query-Partition-Clause>
<Order-By-Clause>
<Windowing-Clause>
)
§ PARTITION BY – divide los datos en grupos

§ ORDER BY – ordena los datos dentro de cada partición

§ WINDOWING – filas o rangos de filas sobre las que se va a trabajar

§ 14
CaracterísEca  3:  Funciones  AnalíEcas  
Avanzadas    

Filas
Proceso Analítico
Evaluación Ordenamiento
Evaluación Agrupamiento
HAVING Intermedio
WHERE

Función
Analítica

ORDER BY
Final
Resultado

§ 15
CaracterísEca  3:  Funciones  AnalíEcas  Avanzadas    
§ RANK() y DENSE_RANK()
SELECT ROW_NUMBER() OVER(ORDER BY sal DESC) rownumber
,RANK() OVER(ORDER BY sal DESC) rank
,DENSE_RANK() OVER(ORDER BY sal DESC) denserank
,sal
,ename
FROM emp
ORDER BY sal DESC,ename;
ROWNUMBER RANK DENSERANK SAL ENAME
--------- ---- ---------- ----- ------
1 1 1 5000 KING
2 2 2 3000 FORD
3 2 2 3000 SCOTT
4 4 3 2975 JONES
5 5 4 2850 BLAKE
6 6 5 2450 CLARK
7 7 6 1600 ALLEN
8 8 7 1500 TURNER
9 9 8 1300 MILLER
10 10 9 1250 MARTIN
11 10 9 1250 WARD
12 12 10 1100 ADAMS
13 13 11 950 JAMES
14 14 12 800 SMITH

§ 16
ParEcionamiento  
§ Las funciones analíticas pueden aplicarse a grupos lógicos dentro del conjunto de
resultados
§ Partitions
... OVER(PARTITION BY mgr ORDER BY sal DESC)

§ PARTITION BY especifica el agrupamiento


§ ORDER BY especifica el ordenamiento dentro de cada grupo
§ No esta relacionado con el particionamiento de tablas
§ Si no se especifica la partición , se toma al resultado completo como una partición.
§ Los valores NULL se agrupan juntos, como en el GROUP BY
§ Pueden usarse diferentes funciones analíticas con distintas subcláusulas de
particionamiento.

§ 17
Particionamiento en funciones analíticas

•  Función  analí1ca  aplicada  a  todas  las  filas  de  la  tabla  

SQL> select employee_id, last_name, manager_id, salary


sum(salary) over (order by employee_id, last_name, salary)
as cumulative from employees;

EMPLOYEE_ID LAST_NAME MANAGER_ID SALARY CUMULATIVE


----------- --------- ---------- ------ ----------
100 King 24000 24000
101 Kochhar 100 17000 41000
102 De Haan 100 17000 58000 = 24000 + 17000 +
17000
103 Hunold 102 9000 67000
104 Ernst 103 6000 73000
105 Austin 103 4800 77800
106 Pataballa 103 4800 82600
107 Lorentz 103 4200 86800
108 Greenberg 101 12000 98800
109 Faviet 108 9000 107800
110 Chen 108 8200 116000
ParEcionamiento:    Ejemplo  
§ Clasificar los empleados en orden de salario por gerente.
SELECT ename
,mgr
,sal
,RANK() OVER(PARTITION BY mgr ORDER BY sal DESC) m_rank
FROM emp
ORDER BY mgr
,m_rank;
ENAME MGR SAL M_RANK
---------- ---------- ---------- ----------
SCOTT 7566 3000 1
FORD 7566 3000 1
ALLEN 7698 1600 1
TURNER 7698 1500 2
WARD 7698 1250 3
MARTIN 7698 1250 3
JAMES 7698 950 5
MILLER 7782 1300 1
ADAMS 7788 1100 1
JONES 7839 2975 1
BLAKE 7839 2850 2
CLARK 7839 2450 3
SMITH 7902 800 1
KING 5000 1

§ 19
Agregación:    La  cláusula  OVER  
SELECT deptno
,AVG(sal)
FROM emp SELECT deptno
GROUP BY deptno; ,AVG(sal) OVER (PARTITION BY deptno) avg_dept
,AVG(sal) OVER () avg_all
DEPTNO AVG(SAL) FROM emp;
---------- ----------
30 1566.66667 DEPTNO AVG_DEPT AVG_ALL No subclause
20 2175 ---------- ---------- ----------
10 2916.66667 10 2916.66667 2073.21429
10 2916.66667 2073.21429
10 2916.66667 2073.21429
20 2175 2073.21429
20 2175 2073.21429
20 2175 2073.21429
20 2175 2073.21429 Agregaciones
20 2175 2073.21429
30 1566.66667 2073.21429
analíticas
30 1566.66667 2073.21429 no reducen el
30 1566.66667 2073.21429
30 1566.66667 2073.21429
número de filas
30 1566.66667 2073.21429
30 1566.66667 2073.21429

§ 20
AnalyEcs  vs  SQL  convencional  
Si se requiere datos a distintos niveles de agrupación
Salario promedio
por departamento
ENAME SAL DEPTNO AVG_DEPT AVG_ALL
------ ---- ------ ---------- ----------
CLARK 2450 10 2916.66667 2073.21429
KING 5000 10 2916.66667 2073.21429
MILLER 1300 10 2916.66667 2073.21429 Salario promedio
JONES 2975 20 2175 2073.21429 total
FORD 3000 20 2175 2073.21429
ADAMS 1100 20 2175 2073.21429
SMITH 800 20 2175 2073.21429
SCOTT 3000 20 2175 2073.21429
WARD 1250 30 1566.66667 2073.21429
TURNER 1500 30 1566.66667 2073.21429
ALLEN 1600 30 1566.66667 2073.21429
JAMES 950 30 1566.66667 2073.21429
BLAKE 2850 30 1566.66667 2073.21429
MARTIN 1250 30 1566.66667 2073.21429

§ 21
Performance  del  SQL  convencional  
SELECT r.ename,r.sal,g.deptno,g.ave_dept,a.ave_all
FROM emp r
,(SELECT deptno,AVG(sal) ave_dept
FROM emp GROUP BY deptno) g
,(SELECT AVG(sal) ave_all
FROM emp) a
WHERE g.deptno = r.deptno
ORDER BY r.deptno;

-----------------------------------------------
| Id | Operation | Name | Rows |
-----------------------------------------------
| 0 | SELECT STATEMENT | | 15 |
| 1 | MERGE JOIN | | 15 |
| 2 | SORT JOIN | | 3 | 1M de empleados
| 3 | NESTED LOOPS | | 3 | 48.35 segundos
| 4 | VIEW | | 1 |
| 5 | SORT AGGREGATE | | 1 |
| 6 | TABLE ACCESS FULL| EMP | 14 |
| 7 | VIEW | | 3 |
| 8 | SORT GROUP BY | | 3 |
| 9 | TABLE ACCESS FULL| EMP | 14 |
|* 10 | SORT JOIN | | 14 |
| 11 | TABLE ACCESS FULL | EMP | 14 |
-----------------------------------------------

§ 22
Performance  del  SQL  analíEco  

SELECT ename,sal,deptno
,AVG(sal) OVER (PARTITION BY deptno) ave_dept
,AVG(sal) OVER () ave_all
FROM emp;

-------------------------------------------
| Id | Operation | Name | Rows |
-------------------------------------------
| 0 | SELECT STATEMENT | | 14 |
| 1 | WINDOW SORT | | 14 | 1M de empleados
| 2 | TABLE ACCESS FULL| EMP | 14 | 21.20 segundos
-------------------------------------------

§ 23
CaracterísEca  3:  Funciones  AnalíEcas  Avanzadas    
SELECT first_name, department_id, salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC ) RANK, --function Rank()
LAG(salary) OVER (PARTITION BY department_id ORDER BY salary DESC ) PREV_HIGH_SAL
-- function Lag()
FROM employees
WHERE department_id IN (10, 20,30,40)
ORDER BY 2, RANK;

§ 24
Ventana  en  expansión  
Primera Partición (o todas las filas) OVER (ORDER BY col_name)
ROWS BETWEEN UNBOUNDED
Ventana  
PRECEDING AND CURRENT ROW

Se produce una ventana en


‘expansión’

Segunda Partición

§ 25
Ventana  deslizante  
Primera Partición (o todas las filas) OVER (ORDER BY col_name)

Ventana   ROWS BETWEEN 2 PRECEEDING


3 Filas
AND 2 FOLLOWING

Se produce una ventana ‘deslizante’

Segunda Partición

§ 26
CaracterísEca  3:  Funciones  AnalíEcas  
Avanzadas    
SELECT first_name, department_id, salary,
AVG(salary) OVER (PARTITION BY department_id ORDER BY hire_date -- function AVG
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as AVG_SAL_PREV_NEXT_ROW
-- Window (additional partitioning)
FROM employees
WHERE department_id IN (10, 20,30,40)
ORDER BY department_id,manager_id;

§ 27
CaracterísEca  3:  Funciones  AnalíEcas    
LAG  and  LEAD  
§ Para comparar valores entre filas
§ LAG permite acceder una fila que se encuentra desplazada cierto número
de posiciones antes de la fila actual.
§ LEAD permite acceder una fila que se encuentra desplazada cierto
número de posiciones después de la fila actual.
{LAG | LEAD} ( value_expr [, offset] [, default] )
OVER ( [query_partition_clause] order_by_clause )

§ Offset es un parámetro opcional, por default es 1


§ Default es opcional y es el valor retornado si offset se sale de los límites
de la tabla o partición. (NULL si no se especifica)

§ 28
CaracterísEca  3:  Funciones  AnalíEcas    
LAG  and  LEAD  
SELECT hiredate
,sal AS salary
,LAG(sal,1) OVER (ORDER BY hiredate) AS LAG1
,LEAD(sal,1) OVER (ORDER BY hiredate) AS LEAD1
FROM emp;
HIREDATE SALARY LAG1 LEAD1
--------- ---------- ---------- ----------
17-DEC-80 800 1600
20-FEB-81 1600 800 1250
22-FEB-81 1250 1600 2975 Comparación de salarios
02-APR-81 2975 1250 2850 entre empleados
01-MAY-81 2850 2975 2450
contratados alrededor de la
09-JUN-81 2450 2850 1500
08-SEP-81 1500 2450 1250 misma fecha
28-SEP-81 1250 1500 5000
17-NOV-81 5000 1250 950
03-DEC-81 950 5000 3000
03-DEC-81 3000 950 1300
23-JAN-82 1300 3000 3000
09-DEC-82 3000 1300 1100
12-JAN-83 1100 3000

§ 29
CaracterísEca  3:  Funciones  AnalíEcas  Avanzadas    

Matriz de Compatibilidad

CaracterísEca   Oracle  versión  

Funciones  Analí1cas   9i  y  superior  

Soporte  Window  func1ons   9i  y  superior  

Valor agregado para diferentes ambientes

OLTP   DSS/ReporEng   Data  


Warehouse  
No   Sí   Sí  

§ 30
CaracterísEca  4:  Funciones  de  Agrupación  
Avanzadas  
SELECT col1, col2,
•  Agregar  a  diferentes  niveles  de   SUM(col3), COUNT(col4),…
granularidad   FROM table1, table2, …
•  Group  by  Cube,  Rollup,  Grouping   WHERE <join condition>
Sets   GROUP BY ... {CUBE | ROLLUP|
GROUPING SETS}
•  Agrupar  strings  usando  
HAVING GROUPING (..)
delimitadores  con  LISTAGG  
•  Beneficios    
–  Reduce  número  bloques  leídos   SELECT  col1,  col2,  
–  Mayor  rendimiento      LISTAGG(expr)    
–  Simplificación  del  código      WITHIN  GROUP    (ORDER  BY  COL)  
–  No  necesita  afinamiento      OVER(PARTITION  BY  COL)  
  FROM table1, table2, …
WHERE <join condition>

§ 31
CaracterísEca  4:  Funciones  de  Agrupación  
Avanzadas  –  LISTAGG  
Ejemplo: listar los nombres de los empleados por departamento,
agregando los nombres de cada departamento en una sola fila
DEPTNO ENAME
--------- ----------
10 CLARK
10 KING
10 MILLER
20 ADAMS SQL> SELECT deptno, LISTAGG(ename, ',')
20 FORD WITHIN GROUP (ORDER BY ename) AS
20 JONES employees
20 SCOTT FROM emp
20 SMITH GROUP BY deptno;
30 ALLEN
30 BLAKE DEPTNO EMPLOYEES
30 JAMES ---------- ------------------------------
30 MARTIN 10 CLARK,KING,MILLER
30 TURNER 20 ADAMS,FORD,JONES,SCOTT,SMITH
30 WARD 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

§ 32
CaracterísEca  4:  Funciones  de  Agrupación  
Avanzadas  –  LISTAGG  
Ejemplo: listar en orden las columnas que forman parte de un índice

SQL> desc user_ind_columns


Name Null Type
--------------- ---- --------------
INDEX_NAME VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
COLUMN_NAME VARCHAR2(4000)
COLUMN_POSITION NUMBER
COLUMN_LENGTH NUMBER
CHAR_LENGTH NUMBER
DESCEND VARCHAR2(4)

§ 33
CaracterísEca  4:  Funciones  de  Agrupación  
Avanzadas  –  LISTAGG  
Ejemplo: listar en orden las columnas que forman parte de un índice

SELECT table_name
,index_name
,LISTAGG(column_name,’;’) WITHIN GROUP (
ORDER BY column_position) “Column List”
FROM user_ind_columns
GROUP BY table_name
,index_name;

TABLE_NAME INDEX_NAME Column List


------------ ------------------ -----------------------------
EMP EMP_PK EMPNO
PROJ_ASST SYS_C0011223 PROJNO;EMPNO;START_DATE
DEPT DEPT$DIVNO_DEPTNO DIVNO;DEPTNO

§ 34
CaracterísEca  4:  Funciones  de  Agrupación  
Avanzadas  
 
Group  by  tradicional  
SELECT department_name, job_title, sum(salary)
FROM employees a, jobs b, departments c
WHERE a.job_id=b.job_id
AND a.department_id=c.department_id
AND c.department_name in ('Sales','IT')
GROUP BY department_name,job_title --aggregate by deptno and job
HAVING sum(salary)>25000
ORDER BY1,2
Un sólo
registro por
grupo

§ 35
CaracterísEca  4:  Funciones  de  Agrupación  
Avanzadas  –  CUBE  y  ROLLUP  

Creadas para la manipulación de modelos de datos en


ambientes de DataWarehousing

•  Cual  sentencia  SQL  nos  permi1ría  obtener  el  


siguiente  resultado  ?  

§ 36
El  operador  CUBE  
City_id   Product_id   Sum_a  
City1   product1   520   SELECT    city_id,  product_id,    
City1   product2   230  
                           SUM(amount)  as  sum_a  
City1   product3   100  
FROM    SALES  
GROUP  BY  CUBE  (city_id,  product_id)  
City1   ALL   850  
City2   Product  1   10  
 
City2   product2   15  
City2   product3   10  
§ Parte del SQL estándar, implementación de
City2   ALL   35  
City3   Product  1   1000   ROLAP (Relational Online analytical Processing)
City3   product2   1200  
City3   product3   1000  
City3   ALL   3200  
ALL   Product  1   1530  
ALL   product2   1445  
ALL   product3   1110  
ALL   ALL   4085  
El  operador  ROLLUP  
City_id   Product_id   Sum_a  
City1   Product  1   520  
City1   product2   230   SELECT    city_id,  product_id,  
City1   product3   100  
SUM(amount)  as  sum_a  
City1   ALL   850   FROM    SALES  
City2   Product  1   10   GROUP  BY  ROLLUP  (city_id,  product_id)  
City2   product2   15  
City2   product3   10  
City2   ALL   35  
City3   Product  1   1000  
City3   product2   1200  
City3   product3   1000  
City3   ALL   3200  
ALL   ALL   4085  
CaracterísEca  4:  Funciones  de  Agrupación  
Avanzadas  -­‐  Rollup  
§ Para obtener subtotales por cada uno de las columnas en el Group by

SELECT department_name, job_title, sum(salary)


FROM employees a, jobs b, departments c
WHERE a.job_id=b.job_id
AND a.department_id=c.department_id
AND c.department_name in ('Sales','IT')
GROUP BY ROLLUP(department_name,job_title) – subtotales por departamento y cargo
HAVING sum(salary)>25000
ORDER BY1,2

§ 39
CaracterísEca  4:  Funciones  de  Agrupación  
Avanzadas  
Matriz de Compatibilidad

CaracterísEca   Oracle  versión  

Funciones  de  Agrupación   9i  y  superior  


Avanzada  

ListAgg   11gR2    únicamente  

Valor agregado para diferentes ambientes

OLTP   DSS/ReporEng   Data  


Warehouse  
Sí   Sí   Sí  

40
Resumen

CaracterísEca   Mejor   Menor   Beneficios  


Rendimiento   mantenimiento  de   adicionales  
código  
SQL  With  y  cláusula  With   X   X   Lookups  
Recursiva     recursivos  
Inserts  mul1-­‐tabla   X   X   Una  sola  
  pasada  de  
compilación  
Funciones  Analí1cas     X   X   Comparación  
en  ventanas  
Funciones  de  agregación   X   X   Operadores  de  
avanzadas   Group  by  
adicionales  

§ 41

También podría gustarte