Show Menu
Cheatography

Buenas practicas SQL Cheat Sheet by

para optimizar recursos de almacenamiento y posteriormente de procesamiento en el lago de datos se recomienda seguir las siguientes recomendaciones.

Creación de tablas

¡Impor­tante! Es obliga­torio guardar las tablas como Parquet y no en formato Text File en el lago de datos debido a que estos últimos ocupan más espacio de almace­nam­iento.
Estructura para crear esto desde Hive
CREATE TABLE Nombre­_Ta­bla­(Sc­hema) ROW FORMAT DELIMITED FIELDS TERMINATED BY "­;" STORED AS PARQUET;

Sentencia SELECT

Evitar usar SELECT *. Es preferible listar las columnas exactas que se usarán en el análisis de forma que se optimice el almace­nam­iento y proces­amiento de la consulta.
a. Código sin optimizar
-- Tabla t1 tiene 90 columnas
select *
from tabla1 t1
b. Código optimizado
select
t1.var1,
t1.var7
from tabla1 t1
Por otro lado, use en lo posible, la función LIMIT para limitar el número de filas visual­izadas.
Select*
from tabla1 t1
Limit 10

Deli­mit­ación de periodos

Evitar realizar consultas que no contengan un periodo delimitado, esto permite que sea mas eficiente, optimi­zando el almace­nam­iento y proces­ami­neto.
a. Código sin optimizar.
Select
t1.var1
t2.var2
from tabla1 t1
b. Código optimi­zado.
Select
t1.var1
t2.var2
from tabla1 t1
where periodo = AAAAMMDD
c. Código optimizado 2.
Select
t1.var1
t2.var2
from tabla1 t1
where periodo Between AAAAMMDD and AAAAMMDD
Por otro lado, si no utiliza un delimi­tador de periodo debe usar la función LIMIT para limitar el número de filas visual­izadas.
Select
from tabla1 t1
Limit 10

Sentencia WHERE vs JOIN

Evitar cruces entre tablas usando WHERE, preferir la definición de cruces con JOIN y todas sus variac­iones (left, right, inner, etc)
a. Código sin optimizar
select
t1.var1,
t1.var7,
t2.var2
from tabla1 t1, tabla2 t2
where t1.var1 = t2.var5
b. Código optimizado
select
t1.var1,
t1.var7,
t2.var2 from tabla1 t1 inner join tabla2 t2
  on t1.var1 = t2.var5
 

Sentencia DISTINCT vs GROUP BY

Para eliminar duplicados preferir DISTINCT en vez de GROUP BY.
a. Código sin optimizar
select
t1.var1
t1.var7
from tabla1 t1
group by t1.var1, t1.var7
b. Código optimizado
select distinct
t1.var1
t1.var7
from tabla1 t1

Sentencias UPDATE vs CASE WHEN

Evitar sentencias de UPDATE poster­iores a consultas y reempl­azarlas en lo posible por sentencias de CASE WHEN para rehusar las sentencias de códigos previas.
a. Código sin optimizar
--- Consulta genera tabla: Tempor­alTabla
select
t1.var1,
t1.var7,
t2.var2
from tabla1 t1 left join tabla2 t2
 on t1.var1 = t2.var5
--- Actual­ización de tabla: Tempor­alTabla
update Tempor­alTabla
set var2 = “No aplica”
where var7 is null
b. Código optimizado
select
t1.var1
t1.var7
case
when var7 is null then “no aplica”
else t2.var2
end as var2
from tabla1 t1 left join tabla2 t2
on t1.var1 = t2.var5

Sentencia IN/NOT IN vs JOINS o WITH

Evitar al máximo consultas anidadas y el uso de IN/NOT IN. Reemplazar por JOINS o por la cláusula WITH para garantizar un código más fácil de leer y/o depurar.

a. Código sin optimizar 1
select
t1.var1,
t1.var7
from tabla1 t1
where t1.var1 in (select t2.columna from tabla2 t2)
b. Código optimizado 1
select
t1.var1,
t1.var7
from tabla1 t1 inner join tabla2 t2
on t1.var1 = t2.columna
c. Código sin optimizar
select
t1.var1,
t1.var7
from tabla1 t1 inner join
(
select
t2.columna
from tabla2 t2 left join* tabla3 t3
on t2.var1 = t3.var1
) temporal
on t1.var1 = tempor­al.c­olumna
d. Código optimizado 2
with temporal as (
select
t2.columna
from tabla2 t2 left join tabla3 t3
on t2.var1 = t3.var1
)
select
t1.var1,
t1.var7
from tabla1 t1 inner join temporal
on t1.var1 = tempor­al.c­olumna
 

Unific­ación de procesos

Unificar procesos similares. No repetir procesos.
a. Código sin optimizar
update
temp_c­ome­rci­os_­nue­vos_cr
set
nuevo_­nombre = replace(nuevo­_no­mbre, ‘www.’,’’)
where
nuevo_nombre like ‘%www.%’
update
temp_c­ome­rci­os_­nue­vos_cr
set
nuevo_­nombre = replace(nuevo­_no­mbre, ‘/bill­’,’’) where
nuevo_­nombre like ‘/bill’ --etc
b. Código optimizado
select
case
when nuevo_­nombre like ‘%/bill%’ then
replace (nuevo­_no­mbre, ‘/bill­’,’’)
when nuevo_­nombre like ‘%www.%’ then
replace(nuevo­_no­mbre, ‘www.’,’’)
else nuevo_­nombre
end as nuevo_­nombre
from temp_c­ome­rci­os_­nue­vos_cr

Conven­ciones

Evitar el uso de alias o nombres temporales ambiguos. Se recomienda aclarar si la constr­ucción es temporal y a que hace refere­ncia, de forma que el proceso de negocio sea coherente y fácil de manipular.
a. Código sin optimizar
select
A.var1,
A.var7
from tabla1 A inner join
(
select
t2.columna
from tabla2 B left join tabla3 C
on B.var1 = C.var1
)D
on A.var1 = D.columna
b. Código optimizado
with estado_tx as (
select t2. columna
from tabla2 movto left join tabla3 novedades
on movto.var1 = noveda­des.var1 )
select
saldos.var1,
saldos.var7
from tabla1.saldos inner join estado_tx
on saldos.var1 = estado­_tx.co­lumna

Nombra­miento tablas temporales

A manera de estándar se recomienda que las tablas temporales creadas dentro de un proceso de SQL sigan la siguiente estruc­tura: temp_A­bre­via­tur­aPr­oye­cto­_no­mbr­eTabla.

Nombres de variables y tablas

Como se mencionó en el punto anterior, se debe evitar la ambigüedad en las tablas o subcon­sultas. Sin embargo, esto aplica también en el nombra­miento de las columnas en las que se recomienda usar el separador "­_" para usar nombres largos. Usar abrevi­aciones cuando se requiera, sin que el uso de las mismas puedan confundir al lector del código.
(Ejemplo: Reemplazar NAprob­aTj­CredCl por nro_ap­rob­aci­on_­tdc­_cl­iente)
 

Comments

No comments yet. Add yours below!

Add a Comment

Your Comment

Please enter your name.

    Please enter your email address

      Please enter your Comment.

          Related Cheat Sheets

          Web Programming Cheat Sheet
          SQL Server Cheat Sheet
          SQL Cheat Sheet