首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在sql server 2008中优化DML操作

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

Stack Overflow用户
提问于 2013-03-01 14:13:00
回答 1查看 240关注 0票数 0

如何在sql server 2008中优化以下查询。我需要优化的特殊select查询。DB=10000中的总记录,如果在9999行中使用_flag=‘flase’,则检索单个记录需要很长时间)

代码语言:javascript
复制
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

注:表详情

代码语言:javascript
复制
  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
EN

回答 1

Stack Overflow用户

发布于 2013-03-01 16:14:35

如果我没理解错你的代码,你基本上是从你的表中选择一个TOP 1行,其中CONSUMED_FLAG = 'false',然后你更新这一行,让它有CONSUMED_FLAG = 'true'CONSUMED_BY = 'MIGBATCH' --你做了10'000次,对吗?

(顺便说一下:在没有ORDER BY的情况下做TOP 1是没有意义的--你得到的是哪种TOP 1?您没有定义顺序-那么您希望TOP 1为您提供“最顶端”行的顺序是什么??)

所以你为什么不这样做:

代码语言:javascript
复制
-- 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中选择要更新的行来定义要更新的内容(行),然后运行one single 语句来更新所有选定的行。好了。没有乱七八糟的循环,什么都没有--就像一个护身符!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15151668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档