tips base datos

4
"Greater Than" Queries Asumiendo que la tabla "table" tiene un índice por el campo "int_col": La consulta: select * from table where int_col > 3 utiliza el índice para buscar el primer valor que cumpla que int_col = 3, y después realiza un scan buscando el primer valor mayor que 3. Si hay muchas filas que cumplan que int_col = 3 el servidor deberá realizar un scan de todas estas páginas hasta encontrar la primera fila en la que int_col es mayor que 3. Probablemente, esta consulta será mucho más eficiente si se escribe como: select * from table where int_col >= 4 Not Exists y Not in En subqueries y sentencias if, las búsquedas por criterios exists e in dan mejor rendimiento que not exists y not in cuando los valores en la cláusula where no están indexados. Para búsquedas por exists e in, el SQL Server puede retornar tan pronto como encuentra una fila que cumple el criterio especificado, sin embargo, para el caso de not exists o not in, debe examinar todos los valores para determinar si existen o no datos. Por ejemplo, if not exists (select * from table where ....) begin /* Sentencias A */ end else begin /* Sentencias B */ end Puede ser fácilmente reescrito y obtendrá un mejor rendimiento, de la siguiente manera: if exists (select * from table where ...) begin /* Sentencias B */ end else begin /* Sentencias A */ end Incluso si no se tiene tratamiento para la cláusula else de la sentencia if, sentencias como: if not exists (select * from table where ...) begin /* Sentencias A*/ end Pueden reescribirse como utilizando la sentencia goto:

Upload: angie-naulaguari

Post on 28-Sep-2015

215 views

Category:

Documents


1 download

DESCRIPTION

tips sql

TRANSCRIPT

  • "Greater Than" Queries

    Asumiendo que la tabla "table" tiene un ndice por el campo "int_col":La consulta:

    select * from table where int_col > 3

    utiliza el ndice para buscar el primer valor que cumpla que int_col =3, y despus realiza un scan buscando el primer valor mayor que 3. Si haymuchas filas que cumplan que int_col = 3 el servidor deber realizar unscan de todas estas pginas hasta encontrar la primera fila en la queint_col es mayor que 3.

    Probablemente, esta consulta ser mucho ms eficiente si se escribe como:select * from table where int_col >= 4

    Not Exists y Not in

    En subqueries y sentencias if, las bsquedas por criterios exists e indan mejor rendimiento que not exists y not in cuando los valores en laclusula where no estn indexados.

    Para bsquedas por exists e in, el SQL Server puede retornar tan prontocomo encuentra una fila que cumple el criterio especificado, sin embargo,para el caso de not exists o not in, debe examinar todos los valores paradeterminar si existen o no datos.

    Por ejemplo,if not exists (select * from table where ....)begin

    /* Sentencias A */endelsebegin

    /* Sentencias B */end

    Puede ser fcilmente reescrito y obtendr un mejor rendimiento, de lasiguiente manera:if exists (select * from table where ...)begin

    /* Sentencias B */endelsebegin

    /* Sentencias A */end

    Incluso si no se tiene tratamiento para la clusula else de la sentenciaif, sentencias como:

    if not exists (select * from table where ...)begin

    /* Sentencias A*/end

    Pueden reescribirse como utilizando la sentencia goto:

  • if exists (select * from table where ....)begin

    goto etiquetaend/* Sentencias A */...

    etiqueta:

    Count vs. Exists

    No utilizar la funcin count en subqueries para chequear existencia.

    Por ejemplo,select *from tabwhere 0 < (select count(*) from tab2 where ....)

    puede reescribirse como:select *from tabwhere exists (select * from tab2 where ..... )

    Cuando se utiliza count() en este tipo de subqueries, el SQL - Server noes capaz de determinar que se est chequeando la existencia, por lo querealiza un count de todos los valores que cumplan el criterio debsqueda, bien realizando un "table scan" o utilizando ndice si existe.

    Si se utiliza exists, el SQL Server sabe que se est chequeando laexistencia, por lo que detiene la bsqueda en cuanto encuentra el primervalor que cumpla el criterio.

    Clusulas OR vs. Unions en joins

    El SQL Server no es capaz de optimizar "joins" unidos mediante OR, sinembargo s optimiza correctamente joins unidos mediante la clusulaUnion, ya que optimiza separadamente cada una de las sentencias select dela query.

    Por ejemplo, la consulta:select *from tab1, tab2where tab1.a = tab2.bor

    tab1.x = tab2.y

    Puede reescribirse, en la mayora de los casos, como:select *from tab1, tab2where tab1.a = tab2.bunionselect *from tab1,tab2where tab1.x = tab2.y

    Funciones Agregadas "max" y "min"

  • El SQL Server utiliza una optimizacin especial para las funcionesagregadas max y min cuando existe un ndice por la columna agregada.

    Para la funcin min lee el primer valor en la pgina raz del ndice.

    Para la funcin max va directamente al final del ndice para buscar laltima fila.

    Esta optimizacin es siempre aplicable, excepto si:

    La expresin utilizada en la funcin max o min no es una columna:Supongamos que la columna col tiene un ndice non-clustered:por ejemplo, select max(col * 2) from tab, no utilizar la optimizacinpor ndice mientras que select max(col) * 2 s lo utilizar.

    La columna utilizada en la funcin agregada max o min no es la primeracolumna de un ndice. En este caso, si el ndice es non clustered, podrencontrar el valor mximo o mnimo en las ltimas pginas de ndice,mientras que si el ndice es un ndice clustered deber realizar un tablescan. En la agregacin por max, existe una clusula where en la consulta

    Un ejemplo de este tipo de optimizacin sera reescribir la consulta:select max(price), min(price)from titlescomo:

    select max(price)from titlesselect min(price)from titles

    Joins y Tipos de Datos

    Cuando se realiza un join entre dos columnas de diferentes tipos dedatos, el tipo de datos de una de las columnas debe ser convertida altipo de la otra. El criterio seguido para realizar esta conversin esconvertir el tipo de menor jerarqua al de mayor (ver pgina B-56 deSYBASE SQL Reference Manual Volume 1).

    Si se realiza el join entre tablas con tipos de datos incompatibles, eloptimizador del SQL Server utilizar ndice en el campo por el que no serealiza la conversin, pero no por el que tiene que ser convertido.Por ejemplo,select *from small_table, large_tablewhere small_table.float_column = large_table.int_colum

    En este caso, SQL Server convierte la columna de tipo entero a float, yaque int es de menor jerarqua que float. Esto ocasiona que no se utiliceel ndice por el campo large_table.int_column.

    Lo mismo ocurrira para el caso,select *from small_table,large_tablewhere small_table.char_col = huge_table.varchar_col

  • La columna varchar va a ser convertida a char, por lo que no utilizar elndice por esta columna.

    En las columnas de tipo carcter esto puede ser evitado sencillamentereescribiendo la consulta como:select * from small_table,large_tablewhere convert(varchar(xx),small_table.char_col) = huge_table.varchar_coldonde xx es el tamao de la columna huge_table.varchar_col

    La mejor recomendacin a este respecto es procurar en tiempo de diseoque las columnas comunes a varias tablas tengan los mismos tipos dedatos.

    (Recordar que a todos los efectos un campo char o binary que admite nulosse comporta como varchar o varbinary respectivamente).

    Parmetros y Tipos de Datos

    Si un parmetro de un procedimiento almacenado no es del mismo tipo dedatos que la columna con la que es comparado en una clusula where, elSQL server fuerza la conversin, con el impacto en la utilizacin dendices descrito en el apartado anterior.

    Por ejemplo,create proc p @x varchar(30)as

    select *from tabwhere char_column = @x

    puede reescribirse como:

    create proc p @x char(30)asselect *from tabwhere char_column = @x

    para obtener un mejor rendimiento.