Consultas SQL

20/12/2003 - 23:24 por Mauricio Sthandier R. | Informe spam
hola... quisiera hacer unas consultas que se me han acumulado el último
tiempo :

a) Hay alguna forma de ver los parámetros de los procedimientos almacenados
extendidos ? a través de syscolumns sólo puedo ver los parámetros de pas
normales
b) Como puedo limpiar el caché de las querys ? En mi trabajo necesito
optimizar consultas, y el problema es que después de la primera query el
tiempo de respuesta se desvirtúa... necesito contrastar tiempos como si la
consulta se corriera por primera vez en cada ejecución sucesiva... se me
olvidaba mencionar que esto es para SQL Server 7.
c) De qué forma resuelven el siguiente problema de Rangos ?

Colegio : 109
Recibos : 1000, 1001, 1002, 1004, 1007, 1008, 1009, 1020, 1021

Necesitaba extraer lo siguiente en cada registro :

Colegio 109, Recibo Inicial 1000, Recibo Final 1002
Colegio 109, Recibo Inicial 1004, Recibo Final 1004
Colegio 109, Recibo Inicial 1007, Recibo Final 1009
Colegio 109, Recibo Inicial 1020, Recibo Final 1021

yo lo he resuelto pero con un SELECT como tabla en el JOIN y subconsultas
MAX y EXISTS para ese SELECT. Acá siempre tienen formas más interesantes y
sencillas de resolver estos temas... si a alguien le interesa o no me
entiende puedo incluir DDL el próximo Lunes.

gracias... espero poder volver por estos lares pronto...

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera [MVP]
21/12/2003 - 17:06 | Informe spam
No recuerdo si DBCC FREEPROCCACHE existia en SQL Server 7, pero por si acaso
te paso esta informacion:

/* extraido de los Books Online SQL 2000 */

Utilice DBCC FREEPROCCACHE para borrar la caché de procedimientos. Por
ejemplo, liberar la caché de procedimientos podría provocar que se volviera
a compilar una instrucción SQL "ad-hoc" en vez de reutilizarse desde la
caché.


Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Mauricio Sthandier R." <mauricio@@sthandier.net> wrote in message
news:
hola... quisiera hacer unas consultas que se me han acumulado el último
tiempo :

a) Hay alguna forma de ver los parámetros de los procedimientos


almacenados
extendidos ? a través de syscolumns sólo puedo ver los parámetros de pas
normales
b) Como puedo limpiar el caché de las querys ? En mi trabajo necesito
optimizar consultas, y el problema es que después de la primera query el
tiempo de respuesta se desvirtúa... necesito contrastar tiempos como si la
consulta se corriera por primera vez en cada ejecución sucesiva... se me
olvidaba mencionar que esto es para SQL Server 7.
c) De qué forma resuelven el siguiente problema de Rangos ?

Colegio : 109
Recibos : 1000, 1001, 1002, 1004, 1007, 1008, 1009, 1020, 1021

Necesitaba extraer lo siguiente en cada registro :

Colegio 109, Recibo Inicial 1000, Recibo Final 1002
Colegio 109, Recibo Inicial 1004, Recibo Final 1004
Colegio 109, Recibo Inicial 1007, Recibo Final 1009
Colegio 109, Recibo Inicial 1020, Recibo Final 1021

yo lo he resuelto pero con un SELECT como tabla en el JOIN y subconsultas
MAX y EXISTS para ese SELECT. Acá siempre tienen formas más interesantes y
sencillas de resolver estos temas... si a alguien le interesa o no me
entiende puedo incluir DDL el próximo Lunes.

gracias... espero poder volver por estos lares pronto...


Respuesta Responder a este mensaje
#2 Liliana Sorrentino
22/12/2003 - 13:44 | Informe spam
Hola Mauricio,
No entiendo tu consulta del punto C, ¿podrías darnos más datos?
Saludos... Liliana.

"Mauricio Sthandier R." <mauricio@@sthandier.net> escribió en el mensaje
news:
hola... quisiera hacer unas consultas que se me han acumulado el último
tiempo :

a) Hay alguna forma de ver los parámetros de los procedimientos


almacenados
extendidos ? a través de syscolumns sólo puedo ver los parámetros de pas
normales
b) Como puedo limpiar el caché de las querys ? En mi trabajo necesito
optimizar consultas, y el problema es que después de la primera query el
tiempo de respuesta se desvirtúa... necesito contrastar tiempos como si la
consulta se corriera por primera vez en cada ejecución sucesiva... se me
olvidaba mencionar que esto es para SQL Server 7.
c) De qué forma resuelven el siguiente problema de Rangos ?

Colegio : 109
Recibos : 1000, 1001, 1002, 1004, 1007, 1008, 1009, 1020, 1021

Necesitaba extraer lo siguiente en cada registro :

Colegio 109, Recibo Inicial 1000, Recibo Final 1002
Colegio 109, Recibo Inicial 1004, Recibo Final 1004
Colegio 109, Recibo Inicial 1007, Recibo Final 1009
Colegio 109, Recibo Inicial 1020, Recibo Final 1021

yo lo he resuelto pero con un SELECT como tabla en el JOIN y subconsultas
MAX y EXISTS para ese SELECT. Acá siempre tienen formas más interesantes y
sencillas de resolver estos temas... si a alguien le interesa o no me
entiende puedo incluir DDL el próximo Lunes.

gracias... espero poder volver por estos lares pronto...


Respuesta Responder a este mensaje
#3 Mauricio Sthandier R.
23/12/2003 - 03:37 | Informe spam
pero por supuesto estímadisima Liliana. Necesito entregar los rangos sin
brechas. Es decir, si tengo valores en orden ascendente 1000, 1001, 1002,
1004, 1007 necesito cerrar el primer rango de 1000 a 1002. Después continúo
con 1004 y como no hay 1005 cierro 1004 consigo mismo. Y así...
El resultado que me interesa con el DDL que proveo es :

colegio lim_inferior lim_superior
-
109 1000 1002
109 1004 1004
109 1007 1009
109 1020 1021

el DDL es :

IF OBJECT_ID('tempdb..#colegios') > 0 DROP TABLE #colegios
IF OBJECT_ID('tempdb..#recibos') > 0 DROP TABLE #recibos
go

CREATE TABLE #colegios (colegio tinyint)
go

CREATE TABLE #recibos (colegio tinyint, recibo smallint)
go

INSERT INTO #colegios VALUES (109)
INSERT INTO #recibos VALUES (109, 1000)
INSERT INTO #recibos VALUES (109, 1001)
INSERT INTO #recibos VALUES (109, 1002)
INSERT INTO #recibos VALUES (109, 1004)
INSERT INTO #recibos VALUES (109, 1007)
INSERT INTO #recibos VALUES (109, 1008)
INSERT INTO #recibos VALUES (109, 1009)
INSERT INTO #recibos VALUES (109, 1020)
INSERT INTO #recibos VALUES (109, 1021)

y finalmente la consulta que quiero optimizar porque da pena es :

SELECT c.colegio, qry.lim_inferior, qry.lim_superior
FROM #colegios c INNER JOIN
(SELECT ls.recibo AS lim_superior, ls.colegio,
(SELECT MAX (li.recibo) FROM #recibos li WHERE li.recibo <ls.recibo AND li.colegio = ls.colegio AND
NOT EXISTS(SELECT * FROM #recibos lic WHERE lic.recibo = li.recibo - 1 AND
lic.colegio = li.colegio)) AS lim_inferior
FROM #recibos ls WHERE NOT EXISTS(SELECT * FROM #recibos lsc WHERE
lsc.recibo ls.recibo + 1)) qry ON c.colegio = qry.colegio

en mi descargo debo decir que esta consulta la tuve que inventar en menos de
una hora para un problema puntual y nocturno, y no he tenido mucho tiempo
para optimizarla :(...

"soy un caprichoso usador de palabras,
no un poeta. Ésa es la verdad."
(Dylan Thomas)
"Liliana Sorrentino" escribió en el mensaje
news:
Hola Mauricio,
No entiendo tu consulta del punto C, ¿podrías darnos más datos?
Saludos... Liliana.

"Mauricio Sthandier R." <mauricio@@sthandier.net> escribió en el mensaje
news:
> hola... quisiera hacer unas consultas que se me han acumulado el último
> tiempo :
>
> a) Hay alguna forma de ver los parámetros de los procedimientos
almacenados
> extendidos ? a través de syscolumns sólo puedo ver los parámetros de pas
> normales
> b) Como puedo limpiar el caché de las querys ? En mi trabajo necesito
> optimizar consultas, y el problema es que después de la primera query el
> tiempo de respuesta se desvirtúa... necesito contrastar tiempos como si


la
> consulta se corriera por primera vez en cada ejecución sucesiva... se me
> olvidaba mencionar que esto es para SQL Server 7.
> c) De qué forma resuelven el siguiente problema de Rangos ?
>
> Colegio : 109
> Recibos : 1000, 1001, 1002, 1004, 1007, 1008, 1009, 1020, 1021
>
> Necesitaba extraer lo siguiente en cada registro :
>
> Colegio 109, Recibo Inicial 1000, Recibo Final 1002
> Colegio 109, Recibo Inicial 1004, Recibo Final 1004
> Colegio 109, Recibo Inicial 1007, Recibo Final 1009
> Colegio 109, Recibo Inicial 1020, Recibo Final 1021
>
> yo lo he resuelto pero con un SELECT como tabla en el JOIN y


subconsultas
> MAX y EXISTS para ese SELECT. Acá siempre tienen formas más interesantes


y
> sencillas de resolver estos temas... si a alguien le interesa o no me
> entiende puedo incluir DDL el próximo Lunes.
>
> gracias... espero poder volver por estos lares pronto...
>
>


Respuesta Responder a este mensaje
#4 Mauricio Sthandier R.
23/12/2003 - 03:39 | Informe spam
gracias pero no tengo ni remotamente permisos suficientes para ejecutar este
DBCC en el trabajo :(

"Gustavo Larriera [MVP]" escribió en el
mensaje news:
No recuerdo si DBCC FREEPROCCACHE existia en SQL Server 7, pero por si


acaso
te paso esta informacion:

/* extraido de los Books Online SQL 2000 */

Utilice DBCC FREEPROCCACHE para borrar la caché de procedimientos. Por
ejemplo, liberar la caché de procedimientos podría provocar que se


volviera
a compilar una instrucción SQL "ad-hoc" en vez de reutilizarse desde la
caché.
Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm
Respuesta Responder a este mensaje
#5 Liliana Sorrentino
23/12/2003 - 15:18 | Informe spam
Hola Mauricio,
Bueno, no es como para decir ¡qué mejora!, pero algo se consiguió según el
plan de ejecución, aunque no en claridad al leer el query (lo tuyo no estaba
tan mal después de todo).
Está basado en la búsqueda de huecos que alguna vez vimos con Miguel Egea
por acá, espero que te sirva.
Saludos... Liliana.

SELECT c.colegio, li.recibo AS inferior, MIN(ls.recibo) AS superior
FROM #colegios c

INNER JOIN
(SELECT t1.colegio, t1.recibo
FROM #recibos t1
LEFT JOIN #recibos t2 ON t1.recibo - 1 = t2.recibo
WHERE t2.recibo IS NULL AND t1.recibo - 1 > 0) AS li
ON li.colegio = c.colegio

INNER JOIN

(SELECT t1.colegio, t1.recibo
FROM #recibos t1
LEFT JOIN #recibos t2 ON t1.recibo + 1 = t2.recibo
WHERE t2.recibo IS NULL AND t1.recibo - 1 > 0) ls
ON ls.colegio = c.colegio AND ls.recibo > li.recibo

GROUP BY c.colegio, li.recibo



"Mauricio Sthandier R." <mauricio@@sthandier.net> escribió en el mensaje
news:
pero por supuesto estímadisima Liliana. Necesito entregar los rangos sin
brechas. Es decir, si tengo valores en orden ascendente 1000, 1001, 1002,
1004, 1007 necesito cerrar el primer rango de 1000 a 1002. Después


continúo
con 1004 y como no hay 1005 cierro 1004 consigo mismo. Y así...
El resultado que me interesa con el DDL que proveo es :

colegio lim_inferior lim_superior
-
109 1000 1002
109 1004 1004
109 1007 1009
109 1020 1021

el DDL es :

IF OBJECT_ID('tempdb..#colegios') > 0 DROP TABLE #colegios
IF OBJECT_ID('tempdb..#recibos') > 0 DROP TABLE #recibos
go

CREATE TABLE #colegios (colegio tinyint)
go

CREATE TABLE #recibos (colegio tinyint, recibo smallint)
go

INSERT INTO #colegios VALUES (109)
INSERT INTO #recibos VALUES (109, 1000)
INSERT INTO #recibos VALUES (109, 1001)
INSERT INTO #recibos VALUES (109, 1002)
INSERT INTO #recibos VALUES (109, 1004)
INSERT INTO #recibos VALUES (109, 1007)
INSERT INTO #recibos VALUES (109, 1008)
INSERT INTO #recibos VALUES (109, 1009)
INSERT INTO #recibos VALUES (109, 1020)
INSERT INTO #recibos VALUES (109, 1021)

y finalmente la consulta que quiero optimizar porque da pena es :

SELECT c.colegio, qry.lim_inferior, qry.lim_superior
FROM #colegios c INNER JOIN
(SELECT ls.recibo AS lim_superior, ls.colegio,
(SELECT MAX (li.recibo) FROM #recibos li WHERE li.recibo <> ls.recibo AND li.colegio = ls.colegio AND
NOT EXISTS(SELECT * FROM #recibos lic WHERE lic.recibo = li.recibo - 1 AND
lic.colegio = li.colegio)) AS lim_inferior
FROM #recibos ls WHERE NOT EXISTS(SELECT * FROM #recibos lsc WHERE
lsc.recibo > ls.recibo + 1)) qry ON c.colegio = qry.colegio

en mi descargo debo decir que esta consulta la tuve que inventar en menos


de
una hora para un problema puntual y nocturno, y no he tenido mucho tiempo
para optimizarla :(...

"soy un caprichoso usador de palabras,
no un poeta. Ésa es la verdad."
(Dylan Thomas)
"Liliana Sorrentino" escribió en el


mensaje
news:
> Hola Mauricio,
> No entiendo tu consulta del punto C, ¿podrías darnos más datos?
> Saludos... Liliana.
>
> "Mauricio Sthandier R." <mauricio@@sthandier.net> escribió en el mensaje
> news:
> > hola... quisiera hacer unas consultas que se me han acumulado el


último
> > tiempo :
> >
> > a) Hay alguna forma de ver los parámetros de los procedimientos
> almacenados
> > extendidos ? a través de syscolumns sólo puedo ver los parámetros de


pas
> > normales
> > b) Como puedo limpiar el caché de las querys ? En mi trabajo necesito
> > optimizar consultas, y el problema es que después de la primera query


el
> > tiempo de respuesta se desvirtúa... necesito contrastar tiempos como


si
la
> > consulta se corriera por primera vez en cada ejecución sucesiva... se


me
> > olvidaba mencionar que esto es para SQL Server 7.
> > c) De qué forma resuelven el siguiente problema de Rangos ?
> >
> > Colegio : 109
> > Recibos : 1000, 1001, 1002, 1004, 1007, 1008, 1009, 1020, 1021
> >
> > Necesitaba extraer lo siguiente en cada registro :
> >
> > Colegio 109, Recibo Inicial 1000, Recibo Final 1002
> > Colegio 109, Recibo Inicial 1004, Recibo Final 1004
> > Colegio 109, Recibo Inicial 1007, Recibo Final 1009
> > Colegio 109, Recibo Inicial 1020, Recibo Final 1021
> >
> > yo lo he resuelto pero con un SELECT como tabla en el JOIN y
subconsultas
> > MAX y EXISTS para ese SELECT. Acá siempre tienen formas más


interesantes
y
> > sencillas de resolver estos temas... si a alguien le interesa o no me
> > entiende puedo incluir DDL el próximo Lunes.
> >
> > gracias... espero poder volver por estos lares pronto...
> >
> >
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida