0

SQL Server 2008 で以下のクエリを最適化する方法。特に最適化する必要があるクエリを選択します。 )

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
4

1 に答える 1

0

私があなたのコードを正しく理解していれば、あなたは基本的にTOP 1テーブル where から行を選択しCONSUMED_FLAG = 'false'、次にこの行を更新してCONSUMED_FLAG = 'true'and CONSUMED_BY = 'MIGBATCH'- そしてこれを 10'000 回行います - ですよね?

ちなみに、 aTOP 1なしで a を実行するの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 内で更新する対象 (行) を選択して定義し、1 つのUPDATEステートメントを実行して、選択したすべての行を更新します。終わり。厄介なループも何もありません - 魅力のように機能します!

于 2013-03-01T08:14:35.490 に答える