Buscar este blog

Mostrando entradas con la etiqueta tips. Mostrar todas las entradas
Mostrando entradas con la etiqueta tips. Mostrar todas las entradas

martes, 23 de febrero de 2021

Función Isnull - Su innecesario y perjudicial uso en sobre campos numéricos -

 

Estimados amigos, el placer de saludarlos nuevamente...

   Trabajando en tunning  sobre unos scripts y encontrando una vez más un pequeño pero perjudicial y repetido  error,  aprovecho para compartirles como trato de hacer asiduamente la experiencia,  con el objetivo de  mejorar la performance de nuestros códigos en general.

Ante todo supongo que todos estamos de acuerdo con el que el uso de funciones en campos donde es muy importante el uso de un índice invalida totalmente la utilización por parte del motor de base de datos del mismo.

 

Ejemplo:

Tenemos una tabla “CONSUMO”  de la cual tenemos que listar los campos “Id”  “FechaPresentacion” cuando la fecha sea mayor al '2020-05-20 23:59:59'

Si existe  un índice que cubra el campo  “FechaPresentación” tendremos una excelente performance a partir de la plena utilización del índice:



  Si, por el contrario, aplicamos algún tipo de función sobre el campo indexado “FechaPresentacion” vamos a dejar sin chances de ser utlizado al índice veamos:

 


Habiendo repasado lo perjudicial que son el uso de funciones en determinados campos, (sobre todo de filtro y ordenamiento, vayamos al uso de la función ISNULL

 

Es muy común ver en queries el uso de esta función ante la necesidad de validar un campo numérico que puede contener valores null

 

Ejemplo:

 

Dada la misma tabla CONSUMO, debemos listar aquellos “id” cuyo consumo,  (campo “importe” de tipo Integer),  es mayor a 5000 pesos.  (hay registros  que pueden tener a la fecha importes con valor NULL)

 

Así  es común ver este tipo de queries:

 

El uso de la función Isnull sobre el campo “Importe” inutiliza el índice sobre dicho campo…

 

Pero .. es necesario el uso de la función Isnull para evitar errores de comparación de campos numéricos con posibles valores nulos? Evitamos de ese modo un posible error?

La respuesta es “no”.   

Cualquier campo numérico null será tomado por el sql server como “0” no siendo necesario utilizar la función Isnull y así inutilizar el eventual índice dispuesto sobre dicho campo.



Utilizaremos el idx y el resultado será el mismo.

Bueno gente me despido esperando que haya sido de utlilidad el tip.

viernes, 10 de junio de 2011

Combinando Vistas del Sistema - Usando Metadata

Amigos,

Muchas veces solemos ahogarnos en un baso de agua al no utilizar todo el potencial que las vistas de catalogo del Sql Server gentilmente nos ofrece.

Aquí tiene un ejemplo de cómo listar cada uno de los índices de Base de Datos, mendiante la combinación de vistas del sistema.

Por favor, no duden en preguntar ante cualquier duda.

Con uds. es script.
---------------------------------------------------------------------------------------------------------------------
-- Detalle: Este script lista todos los índices de una Base de Datos --
-- Gustavo Herrera para Sql Server Tips - http://gherrerasqlserver.blogspot.com/ --
---------------------------------------------------------------------------------------------------------------------

SELECT
o.[name] AS 'Table Name',
i.[name] as 'Index Name',
i.[type_desc]'Description',
f.[name]AS 'Filegroup',
c.[name] as 'Fields'
FROM sys.indexes i
inner JOIN sys.filegroups f -- para saber el filegroup
ON i.data_space_id = f.data_space_id
INNER JOIN sys.objects o -- para nombre de la tabla
ON i.[object_id] = o.[object_id]
inner join Sys.Index_Columns as z --
on z.[object_id] = o.[object_id]
INNER JOIN sys.columns c
on c.[object_id] = z.[object_id] and
c.Column_ID = z.Column_ID
WHERE
o.type = 'U'
and i.[type_desc] <> 'HEAP'
and i.[type_desc] <> 'CLUSTERED' and
i.index_Id = z.index_id
order by o.name,
i.name
GO

lunes, 2 de mayo de 2011

Activity Monitor ? no, no.. mejor vista del Sistema Sys.Sysprocesses

Amigos,

Cuántas veces se han sentido frustrados ante la imposibilidad de poder estudiar "por consola" cuáles son los procesos que están utilizando recursos de Sql Server mediante la poco efectiva herramienta Activity Monitor? Apuesto a que muchas veces que han intentado utilizar esta herramienta en ocasiones en las cuales el Sql está siendo fuertemente impactado, se han topado con un desalentado "Time Out"

Pues bien, a no remar contra la corriente... Bill Gates pensó en nostros y nos da una vista del Sistema llamada Sys.Sysprocesses, la cual nos permite obtener los mismos resultados que el Activity Monitor, sin Time Outs de por medio.

A utlizarla entonces, va un ejemplo.


-- Sys.sysprocesses --
select
spid,
blocked, -- solo valor si está bloqueada
waittime, -- 0 = process its not waiting -
lastwaittype, -- Description of last waiting
dbid, -- Data base id used by the process
cpu, -- Cumulative cpu time for the process
physical_io, -- Cumulative disk reads and writes
memusage, -- Number of page in the cache allocated by the process
Login_time, -- Time in which a process begin to log
last_batch, -- Time in wich a last process has ocurred
open_tran, -- Number of open transactions for the process
status, -- "dormant" -- is being resetting the session --
-- "running" -- is running one or more batches --
-- "background" -- running background process such as rollback process --
-- "pending" -- waiting for thread to continue
-- "runnable" -- the task is in the runnable queue --
-- "suspended" -- waiting for an event to complete --
sid, -- user identificator
hostname, -- name of the workstation
cmd, -- command that is being executed --
nt_username -- user name for the process
from sys.sysprocesses


-- En caso de quere5 "asesinar" un proceso --
KILL SPID;