1

Avant d'ouvrir un ticket avec le support Microsoft, je pensais essayer la communauté!SQL 2008 Modifier la capture de données Problème de performance de requête (SP par rapport à une requête directe)

J'ai une application en développement pour laquelle nous utilisons Change Data Capture dans SQL 2008 R2 (édition développeur, actuellement). Pour certaines requêtes particulièrement complexes, nous voulions envelopper les requêtes dans des procédures stockées, exposant des paramètres communs, pour éviter la complexité dans le client (l'argument habituel) ...

En tout cas, ce que nous avons identifié est que le L'instruction suivante, en tant que requête autonome, s'exécutera dans environ 3 à 5 secondes, quelles que soient les conditions aux limites, tandis que la même instruction, en tant que procédure stockée, sautera à 1,5 minute pour produire les mêmes résultats. En outre, la version SP en cours d'exécution semble changer d'identité plusieurs fois au cours de l'exécution ... Aussi, lors de l'exécution du SP, les pics d'utilisation du processeur.

Des pensées?

la requête:

DECLARE @fromlsn BINARY(10), 
    @tolsn BINARY(10), 
    @NodeID varchar(6) 
SET  @NodeID = '123456', 
     @fromlsn = 0x000017E6000001AC0041, 
     @tolsn = sys.fn_cdc_get_max_lsn() 

DECLARE @min_lsn_TransactionDate BINARY(10), 
     @min_TransactionDate smalldatetime 

SELECT @min_TransactionDate = MIN(TransactionDate) 
FROM cdc.fn_cdc_get_net_changes_dbo_tblOrders(sys.fn_cdc_increment_lsn(@fromlsn),@tolsn,'all with merge') 
WHERE [email protected] and __$operation<>1 

SELECT @min_lsn_TransactionDate = MIN(__$start_lsn) 
FROM cdc.dbo_tblOrders_CT with (nolock) 
WHERE [email protected] 
    AND [email protected]_TransactionDate 

SELECT Table1.TransactionDate 
    ,Table1.OrderNumber 
    ,Table1.SequenceNum 
    ,Table1.ItemNumber 
    ,Table1.Quantity 
    ,Table1.Price 
    ,Table1.ExtPrice 
FROM   cdc.fn_cdc_get_net_changes_dbo_tblOrders(sys.fn_cdc_increment_lsn(@fromlsn),@tolsn,'all with mask') Table1 
WHERE [email protected] 
    AND ( Table1.__$operation=2 
     OR ( Table1.__$operation=4 
      AND (sys.fn_cdc_is_bit_set(9,Table1.__$update_mask)=1 
        OR sys.fn_cdc_is_bit_set(10,Table1.__$update_mask)=1 
       ) 
      ) 
     ) 

Et l'associé procédure stockée:

CREATE PROCEDURE testtesttest 
     @fromlsn BINARY(10), 
     @tolsn BINARY(10), 
     @NodeID varchar(10) 
as 
DECLARE @min_lsn_TransactionDate BINARY(10), 
     @min_TransactionDate smalldatetime 

SELECT @min_TransactionDate = MIN(TransactionDate) 
FROM cdc.fn_cdc_get_net_changes_dbo_tblOrders(sys.fn_cdc_increment_lsn(@fromlsn),@tolsn,'all with merge') 
WHERE [email protected] and __$operation<>1 

SELECT @min_lsn_TransactionDate = MIN(__$start_lsn) 
FROM cdc.dbo_tblOrders_CT with (nolock) 
WHERE [email protected] 
    AND [email protected]_TransactionDate 

SELECT Table1.TransactionDate 
    ,Table1.OrderNumber 
    ,Table1.SequenceNum 
    ,Table1.ItemNumber 
    ,Table1.Quantity 
    ,Table1.Price 
    ,Table1.ExtPrice 
FROM   cdc.fn_cdc_get_net_changes_dbo_tblOrders(sys.fn_cdc_increment_lsn(@fromlsn),@tolsn,'all with mask') Table1 
WHERE [email protected] 
    AND ( Table1.__$operation=2 
     OR ( Table1.__$operation=4 
      AND (sys.fn_cdc_is_bit_set(9,Table1.__$update_mask)=1 
        OR sys.fn_cdc_is_bit_set(10,Table1.__$update_mask)=1 
       ) 
      ) 
     ) 

Script pour exécuter la SP:

DECLARE @fromlsn BINARY(10), 
    @tolsn BINARY(10), 
    @NodeID varchar(6) 
SET  @NodeID = '123456', 
     @fromlsn = 0x000017E6000001AC0041, 
     @tolsn = sys.fn_cdc_get_max_lsn() 

exec testtesttest @fromlsn,@tolsn,@NodeID 

Comme indiqué dans le texte ci-dessus, une requête , cela prend 3-5 secondes (dans Management Studio). En tant que proceure stockée, 1,5 minutes. Comme une requête via le providor .Net framework (System.Data.SqlClient), 1,5 minutes. En requête via le fournisseur OleDb SQLNCLI10, 3-5 secondes. En tant que SP via un Framework ou OleDb, 1,5 minutes.

Des pensées?

+0

Il est vraiment difficile de résoudre ce problème sans être assis devant le serveur et la table, armé de Profiler. Mais il y a certainement des DBA qui se promènent ici avec des coups de génie. Mod les gens! Apportez-les à leur attention! – thomaspaulb

+0

Mon instinct me dit qu'il a à voir avec SP en utilisant des plans d'exécution compilés et la récupération CDC étant sous la forme de fonctions, mais je ne suis pas vraiment à la hauteur sur les rouages ​​internes du moteur sql ... –

Répondre

0

Mon argent serait sur un mauvais plan de requête dans le cache. Essayez soit de vider le cache des procédures (pas sur un système live!) Ou d'utiliser OPTION (Recompiler) dans le SP pour voir si cela aide