none
primera consulta siempre lenta RRS feed

  • Pregunta

  • hola buenos días a todos

    quisiera preguntarles porque siempre que ejecuto un stored procedure específico

    me lo hace muy lento,

    pero solo la primera vez que lo ejecuto, si lo vuelvo a correr lo hace de inmediato

    ALTER PROCEDURE [Avispa].[sp_ClientesTrader_Select]
    @xmlSistema	xml,
    @xmlMercado	xml
    as
    	
    
    		Select * 
    		from Avispa.v_ClientesTraders
    		where 
    		
    		Avispa.v_ClientesTraders.System in (
    					SELECT ITEM_Sistema=PRODUCTDATA.value('@Sistema','Varchar(15)') 
    					FROM @xmlSistema.nodes('/ITEMLIST/ITEM') e(PRODUCTDATA)
    				 )
    		and Avispa.v_ClientesTraders.Market in (
    					SELECT ITEM_Mercado=PRODUCTDATA.value('@Mercado','Varchar(15)') 
    					FROM @xmlMercado.nodes('/ITEMLIST/ITEM') e(PRODUCTDATA)
    					 )
    		
    

    la vista es muy pequeña, tiene 100 registros,

    si mando llamar la vista sin el where, la respuesta es muy rápida

     

    lo lento es cuando le  incluyo el: Avispa.v_ClientesTraders.System in (...

    el xml, me contiene como una tabla con 2 registros en market y uno en system

     

     

    ojala puedan ayudarme

    saludos


     

     

     

    viernes, 25 de febrero de 2011 17:08

Respuestas

  • Omar,

    Es dificil de opinar con tan poca informacion. Yo te recomendaria usar la lista de columnas y no "*" en la clausula "select". Fijate que le adicione un predicado de posicion a los atributos cuando haces la descomposicion de los documentos xml.

    ALTER PROCEDURE [Avispa].[sp_ClientesTrader_Select]
    @xmlSistema	xml,
    @xmlMercado	xml
    as
    SET NOCOUNT ON;
    	
    SELECT
    	* 
    FROM
    	Avispa.v_ClientesTraders AS A
    WHERE
    	Avispa.v_ClientesTraders.System in (
    	SELECT ITEM_Sistema=PRODUCTDATA.value('@Sistema[1]','Varchar(15)') 
    	FROM @xmlSistema.nodes('/ITEMLIST/ITEM') e(PRODUCTDATA)
    	)
    	and Avispa.v_ClientesTraders.Market in (
    	SELECT ITEM_Mercado=PRODUCTDATA.value('@Mercado[1]','Varchar(15)') 
    	FROM @xmlMercado.nodes('/ITEMLIST/ITEM') e(PRODUCTDATA)
    	);
    GO
    

    Pudieras postear un ejemplo de los documentos XML?

    Quizas haya algo mas que podemos informarle a la maquina de xquery. Tambien seria importante ver la vista, la estructura de las tablas que son referenciadas en ella, incluyendo indices y restricciones. Aun mejor si posteas el plan de ejecucion.

    Una cosa que puedes probar es  guardar el contenido de los documentos xml en tablas temporales con indices adecuados para ayudar al optimizador con la estimacion de cardinalidad.


    AMB

    Some guidelines for posting questions...

    viernes, 25 de febrero de 2011 18:46
  •  Hola.

     Al usar una vista dentro de un procedimiento almacenado, en cierta medida estas matando la funcionalidad de los procedimientos, en la que se basan para usar los planes de ejecución ya creados con su primera ejecución, si las circunstancias no cambian.

     La vista, no es ni mas ni menos, que una consulta almacenada en la base de datos, y su comportamiento es el de una consulta, con lo que a planes de ejecución afecta. Cuando ejecutas una consulta sobre la vista, el motor expande la vista y lanza la consulta que hay dentro.

     Te aconsejo que no emplees (no te apoyes en) esa vista, dentro de tu procedimiento almacenado, Crea tus procedimientos almacenados sin acceder a la vista siempre que puedas, asumiendo que ello quizá requiera un poco más de tiempo de implementación.

     Las segundas ejecuciones te van mas rápido, por que probablemente, se estén apoyándo en el mismo plan ya creado, ya que si las consultas y sus condiciones o selectividad de los datos son iguales, mas los datos de la tabla no cambian, estimará usar el mismo plan, que probablemente aun este en memoria (probable también por las ejecuciones que son seguidas sin mucho espacio en el tiempo.)

     Respecto al "in", estas haciendo una subconsulta dentro de una consulta. Yo siempre intente evitarlo, apóyate en  operadores tipo inner join para construir las consultas, aunque te requiera de un poco más de esfuerzo.


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    viernes, 25 de febrero de 2011 23:58

Todas las respuestas

  • Omar,

    Es dificil de opinar con tan poca informacion. Yo te recomendaria usar la lista de columnas y no "*" en la clausula "select". Fijate que le adicione un predicado de posicion a los atributos cuando haces la descomposicion de los documentos xml.

    ALTER PROCEDURE [Avispa].[sp_ClientesTrader_Select]
    @xmlSistema	xml,
    @xmlMercado	xml
    as
    SET NOCOUNT ON;
    	
    SELECT
    	* 
    FROM
    	Avispa.v_ClientesTraders AS A
    WHERE
    	Avispa.v_ClientesTraders.System in (
    	SELECT ITEM_Sistema=PRODUCTDATA.value('@Sistema[1]','Varchar(15)') 
    	FROM @xmlSistema.nodes('/ITEMLIST/ITEM') e(PRODUCTDATA)
    	)
    	and Avispa.v_ClientesTraders.Market in (
    	SELECT ITEM_Mercado=PRODUCTDATA.value('@Mercado[1]','Varchar(15)') 
    	FROM @xmlMercado.nodes('/ITEMLIST/ITEM') e(PRODUCTDATA)
    	);
    GO
    

    Pudieras postear un ejemplo de los documentos XML?

    Quizas haya algo mas que podemos informarle a la maquina de xquery. Tambien seria importante ver la vista, la estructura de las tablas que son referenciadas en ella, incluyendo indices y restricciones. Aun mejor si posteas el plan de ejecucion.

    Una cosa que puedes probar es  guardar el contenido de los documentos xml en tablas temporales con indices adecuados para ayudar al optimizador con la estimacion de cardinalidad.


    AMB

    Some guidelines for posting questions...

    viernes, 25 de febrero de 2011 18:46
  •  Hola.

     Al usar una vista dentro de un procedimiento almacenado, en cierta medida estas matando la funcionalidad de los procedimientos, en la que se basan para usar los planes de ejecución ya creados con su primera ejecución, si las circunstancias no cambian.

     La vista, no es ni mas ni menos, que una consulta almacenada en la base de datos, y su comportamiento es el de una consulta, con lo que a planes de ejecución afecta. Cuando ejecutas una consulta sobre la vista, el motor expande la vista y lanza la consulta que hay dentro.

     Te aconsejo que no emplees (no te apoyes en) esa vista, dentro de tu procedimiento almacenado, Crea tus procedimientos almacenados sin acceder a la vista siempre que puedas, asumiendo que ello quizá requiera un poco más de tiempo de implementación.

     Las segundas ejecuciones te van mas rápido, por que probablemente, se estén apoyándo en el mismo plan ya creado, ya que si las consultas y sus condiciones o selectividad de los datos son iguales, mas los datos de la tabla no cambian, estimará usar el mismo plan, que probablemente aun este en memoria (probable también por las ejecuciones que son seguidas sin mucho espacio en el tiempo.)

     Respecto al "in", estas haciendo una subconsulta dentro de una consulta. Yo siempre intente evitarlo, apóyate en  operadores tipo inner join para construir las consultas, aunque te requiera de un poco más de esfuerzo.


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    viernes, 25 de febrero de 2011 23:58