亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

update值與原值相同時,SQL Server會真的去upda

系統 2163 0
原文: update值與原值相同時,SQL Server會真的去update還是忽略呢?

考慮下面的情況:

當update值與原值相同時,SQL Server會真的去update還是忽略?例如:

      
        update
      
      
         tbname


      
      
        set
      
       name
      
        =
      
      
        '
      
      
        abc
      
      
        '
      
      
        --
      
      
        name原來的值就是abc
      
      
        where
      
       id
      
        =
      
      
        1
      
    

再如:

      
        update
      
      
         tbname


      
      
        set
      
       name
      
        =
      
      
        '
      
      
        abc
      
      
        '
      
      
        --
      
      
        name原來的值就是abc
      
      
        where
      
       name
      
        =
      
      
        '
      
      
        abc
      
      
        '
      
    


接下來我們將實際測試:

      
        --
      
      
        Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)   Jun 17 2011 00:54:03   Copyright (c) Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2) 
      
    

?
1.首先我們先把checkpoint關閉掉,這里用到一個TraceFlog 3505,具體信息參見 這里

      
        DBCC
      
       TRACEON (
      
        3505
      
      );
    

2.準備測試數據:

      
        CREATE
      
      
        DATABASE
      
      
         DB_test 


      
      
        GO
      
      
        USE
      
      
         DB_test


      
      
        GO
      
      
        CREATE
      
      
        TABLE
      
      
         t (

   a 
      
      
        INT
      
      
        ,

   b 
      
      
        CHAR
      
      (
      
        1
      
      
        ),

   
      
      
        CONSTRAINT
      
       PK_t 
      
        PRIMARY
      
      
        KEY
      
      
        CLUSTERED
      
      
         (a)

);

 


      
      
        INSERT
      
      
        INTO
      
       t 
      
        VALUES
      
       (
      
        1
      
      ,
      
        '
      
      
        A
      
      
        '
      
      
        );


      
      
        INSERT
      
      
        INTO
      
       t 
      
        VALUES
      
       (
      
        2
      
      ,
      
        '
      
      
        B
      
      
        '
      
      
        );


      
      
        INSERT
      
      
        INTO
      
       t 
      
        VALUES
      
       (
      
        3
      
      ,
      
        '
      
      
        C
      
      
        '
      
      
        );


      
      
        INSERT
      
      
        INTO
      
       t 
      
        VALUES
      
       (
      
        4
      
      ,
      
        '
      
      
        D
      
      
        '
      
      
        );


      
      
        INSERT
      
      
        INTO
      
       t 
      
        VALUES
      
       (
      
        5
      
      ,
      
        '
      
      
        E
      
      
        '
      
      
        );

 


      
      
        CHECKPOINT
      
      ;
    

3.查看事務日志

      
        SELECT
      
      
        [
      
      
        Current LSN
      
      
        ]
      
      , Operation, Context, 
      
        [
      
      
        Transaction ID
      
      
        ]
      
      
        , AllocUnitName


      
      
        FROM
      
       fn_dblog(
      
        null
      
      , 
      
        null
      
      );
    

得到如下結果:

此處顯示的是之前步驟2的checkpoint的記錄,此時只有兩條記錄

4.此時查看剛創建的表的page情況

      
        DBCC
      
       IND (
      
        '
      
      
        DB_test
      
      
        '
      
      ,
      
        '
      
      
        t
      
      
        '
      
      ,
      
        1
      
      );
    

結果:

我們可以看到上面的 page78 是剛才所插入的5條數據所在的page. (PageType=1是DataPage, PageType=10是IAM Page)

5.執行一個update本身的SQL語句,然后再看事務日志,以及內存中的臟數據

      
        UPDATE
      
      
         t


      
      
        SET
      
       b 
      
        =
      
      
        '
      
      
        C
      
      
        '
      
      
        WHERE
      
       a 
      
        =
      
      
        3
      
      
        ;

 


      
      
        --
      
      
         查看日志
      
      
        SELECT
      
      
        [
      
      
        Current LSN
      
      
        ]
      
      , Operation, Context, 
      
        [
      
      
        Transaction ID
      
      
        ]
      
      
        , AllocUnitName


      
      
        FROM
      
       fn_dblog(
      
        null
      
      , 
      
        null
      
      
        );

 


      
      
        --
      
      
         查看臟數據
      
      
        select
      
      
        *
      
      
        from
      
      
         sys.dm_os_buffer_descriptors


      
      
        where
      
       database_id 
      
        =
      
      
        db_id
      
      () 
      
        AND
      
       is_modified 
      
        =
      
      
        1
      
      
        order
      
      
        by
      
       page_id;
    

結果如下:

從上面的結果,我們看到有事務日志的記錄,但并不是我們的表t,而是sys.sysobjvalues.clst,它是什么呢?從聯機文檔查到:

      sys.sysobjvalues   存在于每個數據庫中。實體的每個常規值屬性均存在對應的一行。
    

從事務日志看,SQL Server并沒有真的去update這條記錄,然后我們看一下臟數據中是否有對這個page的修改:

從上面看到內存中的被修改的Pageid是152,并不是表t的Page78.

由此我們可以認為SQL Server并不會真的去作一個與原值相同的update操作。

6.如果我們此再更新幾個與原值相同的操作,如:

      
        UPDATE
      
      
         t


      
      
        SET
      
       b 
      
        =
      
      
        '
      
      
        D
      
      
        '
      
      
        WHERE
      
       a 
      
        =
      
      
        4
      
      
        ;

 


      
      
        --
      
      
        
          查看日志
        
      
      
        SELECT
      
      
        [
      
      
        Current LSN
      
      
        ]
      
      , Operation, Context, 
      
        [
      
      
        Transaction ID
      
      
        ]
      
      
        , AllocUnitName


      
      
        FROM
      
       fn_dblog(
      
        null
      
      , 
      
        null
      
      
        );

 


      
      
        --
      
      
        
          查看臟數據
        
      
      
        select
      
      
        *
      
      
        from
      
      
         sys.dm_os_buffer_descriptors


      
      
        where
      
       database_id 
      
        =
      
      
        db_id
      
      () 
      
        AND
      
       is_modified 
      
        =
      
      
        1
      
      
        order
      
      
        by
      
       page_id;
    

結果如下:

可以看到事務日志沒有增加新的記錄,臟數據沒有變化,依然是剛才的數據。

7.如果我們此時手動checkpoint,然后再做一個update原值操作呢?

      
        Checkpoint
      
      
        GO
      
      
        UPDATE
      
      
         t


      
      
        SET
      
       b 
      
        =
      
      
        '
      
      
        E
      
      
        '
      
      
        WHERE
      
       a 
      
        =
      
      
        5
      
      
        ;

 


      
      
        --
      
      
        
          查看日志
        
      
      
        SELECT
      
      
        [
      
      
        Current LSN
      
      
        ]
      
      , Operation, Context, 
      
        [
      
      
        Transaction ID
      
      
        ]
      
      
        , AllocUnitName


      
      
        FROM
      
       fn_dblog(
      
        null
      
      , 
      
        null
      
      
        );

 


      
      
        --
      
      
        
          查看臟數據
        
      
      
        select
      
      
        *
      
      
        from
      
      
         sys.dm_os_buffer_descriptors


      
      
        where
      
       database_id 
      
        =
      
      
        db_id
      
      () 
      
        AND
      
       is_modified 
      
        =
      
      
        1
      
      
        order
      
      
        by
      
       page_id;
    

結果如下:

8.如果我們更新一個不同的值,會是什么情況?

      
        UPDATE
      
      
         t


      
      
        SET
      
       b 
      
        =
      
      
        '
      
      
        Z
      
      
        '
      
      
        WHERE
      
       a 
      
        =
      
      
        1
      
      
        ;

 


      
      
        --
      
      
        
          查看日志
        
      
      
        SELECT
      
      
        [
      
      
        Current LSN
      
      
        ]
      
      , Operation, Context, 
      
        [
      
      
        Transaction ID
      
      
        ]
      
      
        , AllocUnitName


      
      
        FROM
      
       fn_dblog(
      
        null
      
      , 
      
        null
      
      
        );

 


      
      
        --
      
      
        
          查看臟數據
        
      
      
        select
      
      
        *
      
      
        from
      
      
         sys.dm_os_buffer_descriptors


      
      
        where
      
       database_id 
      
        =
      
      
        db_id
      
      () 
      
        AND
      
       is_modified 
      
        =
      
      
        1
      
      
        order
      
      
        by
      
       page_id;
    

結果如下:

我們可以很清楚的看到它的update的Log以及臟數據page.

9.所以,由上面的多個測試結果可以看出,如果update的值與原值相同,SQL Server并不會真的去做一個這樣的操作,而是忽略掉了。

10.通過工具ApexSQL也可以證明這個結論,它只記錄了insert和最后一次update;

11.最后,記得DBCC TRACEOFF (3505);


此文基本參考: http://www.bobpusateri.com/archive/2010/10/updates-that-really-arent/

?

?

?

?

update值與原值相同時,SQL Server會真的去update還是忽略呢?


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 奇米影音第四色 | 九九国产 | 国产精品视频一区二区三区经 | 一级特级欧美午夜片免费观看 | 久久精品一区二区国产 | 不卡影院网 | 欧美成人h版影片在线观看 欧美成人h精品网站 | 免费黄a | 亚洲国产综合专区在线播一一 | 一区二区三区在线视频观看 | 欧美特欧美特级一片 | 亚洲免费视频播放 | 欧美日韩亚洲一区二区三区 | 国产精品久久久久久久免费 | 国产精品午夜在线观看 | 日日干夜夜拍 | 国产精品久久久久鬼色 | 国产伦理精品 | 久草这里只有精品 | 99热久久精里都是精品66 | 在线国产视频 | 中文字幕 亚洲精品 | 国产一级影片 | 日本一级毛片片免费观看 | 欧美最猛性xxxxx短视频 | 亚洲麻豆| 国产精品视频免费观看 | 精品免费tv久久久久久久 | 手机看片国产精品 | 四虎永久在线免费观看 | 日本一级毛片视频在线看 | 九九这里只有精品视频 | free性欧美video69 | 最新久久精品 | 日韩精品欧美成人 | 黄色网址中文字幕 | 伊人网综合视频 | 久久日本精品国产精品白 | 香蕉视频禁止18 | 久草免费新视频 | 在线观看欧洲成人免费视频 |