Filtro optimo

26/01/2009 - 16:36 por Alhambra Eidos Desarrollo | Informe spam
Hola a todos,

qué filtro es más óptimo en cuanto a rendimiento de la ejecución d euna
consulta SQL en Sql server 2005 express con una BD con compatibilidad 2000 ?

1.)
SELECT ... FROM tabla
WHERE numeroExpediente LIKE
'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

2.)
SELECT ... FROM tabla
WHERE ISNUMERIC(numeroExpediente) = 1

saludos y muchas gracias de antemano.

http://www.alhambra-eidos.es/web2005/index.html
www.kiquenet.com/churrosoft
http://www.setbb.com/putainformatic...opic.php?p„3
www.trabajobasura.com/solusoft

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
26/01/2009 - 16:46 | Informe spam
Mira el plan de ejecución de ambas consultas y podrás comprobarlo por tí
mismo...


Un saludo
-
www.navento.com
Servicios de Localización GPS


"Alhambra Eidos Desarrollo" wrote:

Hola a todos,

qué filtro es más óptimo en cuanto a rendimiento de la ejecución d euna
consulta SQL en Sql server 2005 express con una BD con compatibilidad 2000 ?

1.)
SELECT ... FROM tabla
WHERE numeroExpediente LIKE
'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

2.)
SELECT ... FROM tabla
WHERE ISNUMERIC(numeroExpediente) = 1

saludos y muchas gracias de antemano.

http://www.alhambra-eidos.es/web2005/index.html
www.kiquenet.com/churrosoft
http://www.setbb.com/putainformatic...opic.php?p„3
www.trabajobasura.com/solusoft

Respuesta Responder a este mensaje
#2 Jose Mariano Alvarez
26/01/2009 - 23:31 | Informe spam
Esto no te sirve?

SELECT <columnasnecesarias> FROM tabla
WHERE numeroExpediente between '00000000000' and '99999999999'

Apostaria a que ninguna de las dos que has dado como alternativa va a hacer
un seek, pero si alguna lo hace es la primera.
La segunda nunca va a hacer un seek.
La primera si la selectividad es mala tampoco va a hacer un seek,



Saludos

Ing. Jose Mariano Alvarez
SQLTotal Consulting


(Cambia los ceros por O y saca lo que sobra)


Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase. Por
favor tratar de indicar la versión de SQL y Service Pack. La inclusión de
(CREATE, INSERTS, etc.) para poder reproducir el problema también ayuda.








"Alhambra Eidos Desarrollo"
wrote in message
news:
Hola a todos,

qué filtro es más óptimo en cuanto a rendimiento de la ejecución d euna
consulta SQL en Sql server 2005 express con una BD con compatibilidad 2000
?

1.)
SELECT ... FROM tabla
WHERE numeroExpediente LIKE
'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

2.)
SELECT ... FROM tabla
WHERE ISNUMERIC(numeroExpediente) = 1

saludos y muchas gracias de antemano.

http://www.alhambra-eidos.es/web2005/index.html
www.kiquenet.com/churrosoft
http://www.setbb.com/putainformatic...opic.php?p„3
www.trabajobasura.com/solusoft

Respuesta Responder a este mensaje
#3 Alejandro Mesa
27/01/2009 - 19:42 | Informe spam
Jose y Alhambra,

Por que no hacen una prueba y nos dicen lo que encontraron?

USE Northwind
GO

SELECT CAST(CASE WHEN OrderID % 5 = 0 THEN LTRIM(OrderID) + CHAR(65 +
OrderID % 25) ELSE LTRIM(OrderID) END AS VARCHAR(15)) AS c1
INTO #t
FROM dbo.Orders
GO

CREATE UNIQUE CLUSTERED INDEX #t_c1
ON #t(c1)
GO

SET SHOWPLAN_TEXT ON
GO

SELECT c1
FROM #t
WHERE ISNUMERIC(c1) = 1
GO

SELECT c1
FROM #t
WHERE c1 LIKE '[0-9][0-9][0-9][0-9][0-9]'
GO

SELECT c1
FROM #t
WHERE c1 BETWEEN '00000' AND '99999'
GO

SET SHOWPLAN_TEXT OFF
GO

DROP TABLE #t
GO

Resultado:

SELECT c1 FROM #t WHERE ISNUMERIC(c1) = 1

|--Clustered Index Scan(OBJECT:([tempdb].[dbo].[#t]),
WHERE:(isnumeric([tempdb].[dbo].[#t].[c1])=(1)))

SELECT c1 FROM #t WHERE c1 LIKE '[0-9][0-9][0-9][0-9][0-9]'

|--Clustered Index Seek(OBJECT:([tempdb].[dbo].[#t]),
SEEK:([tempdb].[dbo].[#t].[c1] >= '÷þþþþþþþþþþþþþþþþþþþþþþþþ' AND
[tempdb].[dbo].[#t].[c1] < 'A'), WHERE:([tempdb].[dbo].[#t].[c1] like
'[0-9][0-9][0-9][0-9][0-9]') ORDERED FORWARD)

SELECT c1 FROM #t WHERE c1 BETWEEN '00000' AND '99999'

|--Clustered Index Seek(OBJECT:([tempdb].[dbo].[#t]),
SEEK:([tempdb].[dbo].[#t].[c1] >= '00000' AND [tempdb].[dbo].[#t].[c1] <=
'99999') ORDERED FORWARD)

Esto nos dice que el plan de ejecucion de las ultimas dos son iguales, no
asi para para la sentencia que usa ISNUMERIC, que es lo esperado opues
sabemos que si manipulas la columna en el predicado, las posibilidades de uso
de las estadisticas de distribucion es minima.

El plan tambien puede cambiar si lo que tenemos es un indice nonclustered y
la cantidad de filas que machan la expresion es tal que un scan de la tabla o
de el indice clustered es menos costoso.

Ahora, estas expresiones no son identicas en cuanto a los datos que pueden
traer, ya que las dos primeros no traeran numeros fuera de ese rango,
mientras la sentencia que usa ISNUMERIC que traer valores fuera de el rango
como 66666666.


AMB

"Jose Mariano Alvarez" wrote:

Esto no te sirve?

SELECT <columnasnecesarias> FROM tabla
WHERE numeroExpediente between '00000000000' and '99999999999'

Apostaria a que ninguna de las dos que has dado como alternativa va a hacer
un seek, pero si alguna lo hace es la primera.
La segunda nunca va a hacer un seek.
La primera si la selectividad es mala tampoco va a hacer un seek,



Saludos

Ing. Jose Mariano Alvarez
SQLTotal Consulting


(Cambia los ceros por O y saca lo que sobra)


Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase. Por
favor tratar de indicar la versión de SQL y Service Pack. La inclusión de
(CREATE, INSERTS, etc.) para poder reproducir el problema también ayuda.








"Alhambra Eidos Desarrollo"
wrote in message
news:
> Hola a todos,
>
> qué filtro es más óptimo en cuanto a rendimiento de la ejecución d euna
> consulta SQL en Sql server 2005 express con una BD con compatibilidad 2000
> ?
>
> 1.)
> SELECT ... FROM tabla
> WHERE numeroExpediente LIKE
> '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
>
> 2.)
> SELECT ... FROM tabla
> WHERE ISNUMERIC(numeroExpediente) = 1
>
> saludos y muchas gracias de antemano.
>
> http://www.alhambra-eidos.es/web2005/index.html
> www.kiquenet.com/churrosoft
> http://www.setbb.com/putainformatic...opic.php?p„3
> www.trabajobasura.com/solusoft
>

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida