2013-03-01 39 views
0

如何在sql server 2008中優化下面的查詢。 特殊選擇需要優化的查詢(例如,DB = 10000中的totoal記錄,以及如果consume_flag ='flase 「在9999行其抽空多的時間來檢索單個記錄)如何優化SQL Server 2008中的DML操作

DECLARE @proxyAcctToken nvarchar(50) 
DECLARE @pmtAcctToken varchar(50) 
DECLARE @ErrorCode varchar(50) 
DECLARE @returnMessage varchar(1000) 
DECLARE @ErrorStep varchar(100) 
DECLARE @tokenSeqNo int 
DECLARE @count int 
SELECT @count=100000 

WHILE(@count>0) 
    BEGIN 
      SELECT @ErrorCode = @@ERROR 
      BEGIN TRY 
       SELECT top 1 @tokenSeqNo=S_NO,@pmtAcctToken = PMT_ACCT_TOKEN, @proxyAcctToken=PROXY_PMT_TOKEN 
       FROM PCTransDB.dbo.MIG_TOKEN_DUMP WHERE CONSUMED_FLAG = 'false' 

       UPDATE PCTransDB.dbo.MIG_TOKEN_DUMP SET CONSUMED_FLAG = 'TRUE', CONSUMED_BY = 'MIGBATCH' WHERE S_NO = @tokenSeqNo 
       PRINT @count 


      SELECT @ErrorCode = 0 

      /************************************* 
      * Return from the Stored Procedure 
      *************************************/ 
    END TRY 

    BEGIN CATCH 
    PRINT 'IN CATCH BLOCK' 
    END CATCH 
    SELECT @count = @count-1 
    SELECT @proxyAcctToken = null 
    SELECT @pmtAcctToken =null 
END 

注:表詳細

Column Nmae   DataType IsNullable 
    S_NO     int  NO 
    PROXY_PMT_TOKEN nvarchar  NO 
    PMT_ACCT_TOKEN nvarchar  NO 
    CONSUMED_FLAG  bit  NO 
    CONSUMED_BY  nvarchar YES 
+0

擺脫'WHILE'循環....在單個T-SQL語句中寫入'UPDATE' - 這將顯着加快速度! – 2013-03-01 06:16:48

+0

@marc_s。特殊選擇需要優化的查詢(例如,DB中的總記錄數= 10000,如果9999行中的consume_flag ='flase',則需要花費很多時間來檢索單個記錄) – Manu 2013-03-01 07:02:13

回答

0

如果我正確理解你的代碼,你基本上是從選擇的TOP 1行你的桌子在哪裏CONSUMED_FLAG = 'false',然後你更新這一行有CONSUMED_FLAG = 'true'CONSUMED_BY = 'MIGBATCH' - 你做這個10'000次 - 對吧?

BTW側面說明:做一個TOP 1,而無需一個ORDER BY是很沒有意義的 - 這TOP 1你得到你沒有定義的命令 - 所以你期望的TOP 1給你「頂什麼順序? - 大多數」行??

那麼,爲什麼你不只是做:

-- use a CTE (Common Table Expression) to select the TOP 10000 rows 
-- you need to SPECIFY AN ORDER BY for this to make sense! 
;WITH CTE AS 
(
    SELECT TOP 10000 
     S_NO 
    FROM  
     PCTransDB.dbo.MIG_TOKEN_DUMP 
    WHERE 
     CONSUMED_FLAG = 'false' 
    ORDER BY 
     ?????? 
) 
UPDATE 
    PCTransDB.dbo.MIG_TOKEN_DUMP 
SET 
    CONSUMED_FLAG = 'TRUE', CONSUMED_BY = 'MIGBATCH' 
FROM 
    CTE 
WHERE 
    CTE.S_NO = PCTransDB.dbo.MIG_TOKEN_DUMP.S_NO 

基本上,只要確定你想要的更新(這行)通過選擇它們的CTE裏面,然後運行單一UPDATE陳述更新所有選定的行。完成。沒有雜亂的循環,沒有什麼 - 像魅力一樣工作!

+0

感謝post marc_s – Manu 2013-03-04 06:43:44