如何在sql server 2008中优化DML操作

时间:2013-03-01 06:13:00

标签: sql-server-2008

如何在sql server 2008中优化以下查询。 特别是我需要优化的选择查询。(例如,DB = 10000中的totoal记录,如果在9999行中的consume_flag ='flase',则需要花费大量时间来检索单个记录)

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

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的代码,您基本上是从TOP 1的表中选择CONSUMED_FLAG = 'false'行,然后将此行更新为CONSUMED_FLAG = 'true'和{{1 - 你做了10'000次 - 对吧?

顺便说一下:在没有CONSUMED_BY = 'MIGBATCH'的情况下进行TOP 1非常毫无意义 - 你得到ORDER BY?你没有定义订单 - 所以您期望TOP 1以什么顺序为您提供“最顶层”行?

那你为什么不这样做呢?

TOP 1

基本上,只需在CTE中选择要更新的内容(哪些行),然后运行一个-- 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 语句来更新所有选定的行。完成。没有凌乱的循环,没有 - 就像一个魅力!