2011-07-21 11 views
0

こんにちは私は誰がこのクエリを最適化する必要がありますどのようなヒントを持っているwounder?どのように最適化とSQLクエリのヒント

DECLARE @RowsToProcess int 
DECLARE @CurrentRow  int 
DECLARE @SelectCol1  int 
declare @dateNow datetime 
declare @macAdress varchar(100); 
declare @port varchar(100); 
declare @switchName varchar(100); 
declare @vlan varchar(100); 

declare @changedmacAdress varchar(100); 
declare @changedvlan varchar(100); 

DECLARE @table1 TABLE (RowID int not null primary key identity(1,1), col1 int, 
[macAdress] [varchar](255) NULL, 
[portName] [varchar](255) NULL, 
[switchName] [varchar](255) NULL, 
[vlan] [varchar](255) NULL) 

INSERT into @table1 SELECT id,macAdress,portName,switchName,vlan FROM ForwardDatabase 

SET @[email protected]@ROWCOUNT 

select @dateNow = getdate() 

SET @CurrentRow=0 
WHILE @CurrentRow<@RowsToProcess 
BEGIN 
    SET @[email protected]+1 
    SET @macAdress = null; 
SET @port = null; 
SET @switchName = null; 
SET @vlan = null; 

    SET @changedmacAdress = null; 
    SET @changedvlan = null; 


    SELECT 
    @SelectCol1=col1,@macAdress=macAdress,@port=portName,@switchName=switchName,@vlan=vlan 
    FROM @table1 
    WHERE [email protected] 


    select @macAdress=macAdress,@port=portName,@switchName=switchName,@vlan=vlan from @table1 where RowID = @SelectCol1 

    select @changedmacAdress=macAdress,@changedvlan=vlan from HistoryForwardDatabase where macAdress= @macAdress and vlan = @vlan and portName = @port and [email protected] and changeDate = (select MAX(changedate) from HistoryForwardDatabase where portName = @port and [email protected]) 

    IF(@changedmacAdress is null and @changedvlan is null) 
    begin  
    insert into HistoryForwardDatabase (macAdress,portname,changeDate,switchName,vlan) select macAdress,portName,@dateNow,switchName,vlan from @table1 where portName = @port and switchName [email protected] 
    end 
END 
+5

質問を最適化するヒントがあります:特定のことを尋ね、ユースケースやテーブル構造のような背景を与えます。ここに30行の手続きを投げたり、1行を要求したりしないでください。 – Jacob

+1

今後の参考として、いつでもカーソルやwhileループを使用するように誘惑されるときは、誘惑に抵抗し、物事を行うためのセットベースの方法があるかどうかを見てください。時間の90%以上があり、はるかに速く動作します。大規模なループではない場合でも、大規模なデータセットを処理するときには、セットベースのソリューションがわかるように、これを実行します。これは役立つかもしれません:http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM

+0

ありがとうございます。私は心配しています:) – Trind

答えて

2

このクエリはあなたのためにトリックを行う可能性があります:

INSERT INTO HistoryForwardDatabase (macAdress, portname, changeDate, switchName, vlan) 
SELECT f.macAdress, f.portName, h.changeDate, f.switchName, f.vlan 
FROM ForwardDatabase AS f 
LEFT JOIN HistoryForwardDatabase AS h 
    ON f.macAdress= h.macAdress 
    AND f.vlan = h.vlan 
    AND f.portName = h.portName 
    AND f.switchname= h.switchName 
    AND h.changeDate = (SELECT MAX(h2.changedate) 
     FROM HistoryForwardDatabase h2 
     WHERE h2.portName = h.portName 
     AND h2.switchname h.switchName) 
WHERE h.macAddress IS NULL AND h.vlan IS NULL 
+1

+1セットベースの操作は行く方法です。 – Tomalak

+0

助けてくれてありがとう。 – Trind

-1

最適化は非常に抽象的用語です。速度を最適化する必要がある場合は、実行計画を使用してみてください。