• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 實踐證明在數據庫中使用游標效果會更好

    發表于:2008-05-15來源:作者:點擊數: 標簽:數據庫實踐游標效果
    在 數據庫 中有兩個表,一個比較巨大,大約1千萬條記錄(表Big),另一個只有5000條(表small)。 目前需要根據表small來更新表Big。 UPDATE Big SET Bf1=0 WHERE BigId IN(SELECT BigId FROM Small WHERE Sf10) 但是這樣執行下來,速度非常慢,并且連接使用這臺D
    數據庫中有兩個表,一個比較巨大,大約1千萬條記錄(表Big),另一個只有5000條(表small)。

      目前需要根據表small來更新表Big。

      UPDATE Big SET Bf1=0 WHERE BigId IN(SELECT BigId FROM Small WHERE Sf1>0)

      但是這樣執行下來,速度非常慢,并且連接使用這臺DB服務器的程序也都慢了下來,幾近不可用。

      仔細分析這條SQL語句,使用了IN。有人說IN是會分拆成一個個OR表達式的,而OR語句將不會使用索引,所以有時候遇到OR,會用UNION ALL來代替。

      但在這里用UNION ALL是不行的。

      根據筆者的猜想,這條SQL語句大概會用上全表搜索,大表1千萬條記錄,那么至少比較1千萬次,怎么會不慢呢。

      于是選擇改用游標,先將小表的記錄提取出來,然后一條條的跟大表結合執行。

      DECLARE curT CURSOR FOR SELECT BigId FROM Small WHERE Sf1>0;
      DECLARE @Id INT;
      OPEN curT;
      FETCH NEXT FROM curT INTO @Id;
      WHILE @@FETCH_STATUS = 0
      BEGIN
      UPDATE Big SET Bf1=0 WHERE BigId=@BigId;
      FETCH NEXT FROM curT INTO @Id;
      END
      CLOSE curT;
      DEALLOCATE curT;

      這樣游標里的記錄數量最多也只會有5000條,BidId在大表里又有索引,分成5000次執行,雖然在連接編譯時花了一些時間,但與恐怖的巨大表全表搜索比較,是微乎其微。

      實踐證明,上面的語句在大約4分鐘執行完畢,在此期間使用此數據庫的應用程序不受影響,速度同樣很快。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>