2014-07-01 4 views
0

J'ai besoin d'un conseil pour régler TSQL afin de l'exécuter plus rapidement, cela prend beaucoup trop de temps bien que cela fonctionne. C'est peut-être parce que je vais chercher une clé d'une autre table avant que je puisse faire l'insertion, des idées n'importe qui?Accélération d'une procédure TSQL d'insertion

DECLARE db_cursorReads CURSOR FOR SELECT 
     [MeterId] 
     ,[MeterRead] 
     FROM MdsReadsImports; 

declare @PremiseMeterId int; 
declare @MeterId nvarchar(24); 
declare @MeterRead int; 

OPEN db_cursorReads; 
FETCH NEXT FROM db_cursorReads INTO 
     @MeterId 
     ,@MeterRead; 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    set @PremiseMeterId = (select top 1 PremiseMeterId from PremiseMeters where MeterId = @MeterId) 

    insert into PremiseMeterReads (MeterRead,PremiseMeterId) 
    values (@MeterRead, @MPremiseMeterId) 

    FETCH NEXT FROM db_cursorReads INTO 
    @MeterId 
     ,@MeterRead; 

END; 
CLOSE db_cursorReads; 
DEALLOCATE db_cursorReads; 
+0

Quelle est la taille des tables? Ont-ils des index? – NeedAnswers

+0

et comme je vois que vous n'avez pas besoin d'utiliser un curseur dans ce cas, évitez-les autant que possible – NeedAnswers

+0

Êtes-vous sûr que le code est correct? Vous n'utilisez pas '@ PremiseMeterID'. –

Répondre

1

Je vois que vous récupérez PremiseMeterId mais ne l'utilisez pas dans le script que vous avez publié. Vous pouvez peut-être abandonner le curseur et effectuer une seule requête basée sur un ensemble:

INSERT INTO PremiseMeterReads (MeterRead,MeterId) 
SELECT 
    [MeterRead] 
    ,[MeterId] 
FROM MdsReadsImports; 
+1

insert dans PremiseMeterReads (Reading, PremiseMeterId, MeterReadType) \t select i.MeterRead \t (sélectionner top 1 PremiseMeterId de PremiseMeters où D3001_MeterId = i.D3001_MeterId) \t, i.MeterReadType de MdsReadsImports i; – John

1

D'abord, je note que vous configurez mais pas en utilisant @PremiseMeterID.

Deuxièmement, vous semblez le faire:

insert into PremiseMeterReads (MeterRead, MeterId) 
    select MeterRead, MeterId 
    from MdsReadsImports; 

Une opération à base de jeu devrait être beaucoup plus rapide que d'utiliser un curseur.

+0

C'est la bonne approche mais Vérifiez l'ordre des paramètres Gordon. –

+0

@ActionDan. . . Je vous remercie. –