自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入講解游標(biāo)類型為什么會產(chǎn)生數(shù)據(jù)檢索

運維 數(shù)據(jù)庫運維
數(shù)據(jù)檢索(data retrieval)是將經(jīng)過選擇、整理和評價(鑒定)的數(shù)據(jù)存入某種載體中,并根據(jù)用戶需要從某種數(shù)據(jù)集合中檢索出能回答問題的準(zhǔn)確數(shù)據(jù)過程或技術(shù)。那么游標(biāo)類型為什么會產(chǎn)生數(shù)據(jù)檢索呢?

導(dǎo)讀:游標(biāo)提供了一種對從表中檢索出的數(shù)據(jù)進行操作的靈活手段,就本質(zhì)而言,游標(biāo)實際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機制。本文將為大家深入講解游標(biāo)類型為什么會產(chǎn)生數(shù)據(jù)檢索的問題。
游標(biāo)類型產(chǎn)生的數(shù)據(jù)檢索問題:

  現(xiàn)象:

  在將數(shù)據(jù)庫兼容的級別從80改到90以后, 下文中的游標(biāo)循環(huán)不出數(shù)據(jù), 單獨SELECT卻會有結(jié)果:

  DECLARE MyCursor CURSOR LOCAL READ_ONLY
  FOR
  SELECT
  Col1
  FROM tbname WITH(NOLOCK)
  WHERE Name LIKE 'SNET%'
  AND B_Key IN(
  SELECT ***00)
  KeyID
  FROM tbmaster WITH(NOLOCK)
  WHERE Date >= '01/01/2007'
  AND Date < '02/01/2007')
  OPEN MyCursor
  FETCH NEXT FROM MYCURSOR
  WHILE (@@FETCH_STATUS=0)
  BEGIN
  FETCH NEXT FROM MYCURSOR
  END
  CLOSE MyCursor
  DEALLOCATE MyCursor


  原因:

  游標(biāo)類型的問題。

  參照以上的定義, 游標(biāo)類型是: DYNAMIC

 

 在定義此類游標(biāo)的情況下, S鎖是必須下的, NOLOCK提示并不會起作用,此現(xiàn)象通過查詢游標(biāo)OPEN時的sp_lock信息就可以觀察得到。它產(chǎn)生了IS和S鎖。

  而NOLOCK 提示是否起作用, 會影響的執(zhí)行的結(jié)果(執(zhí)行計劃一樣, 但在取數(shù)據(jù)的時候, 卻會有所差異)

  對于下面這句, 有NOLOCK 和無NOLOCK 時, 它取的數(shù)據(jù)是不一樣的, 因為它只取了***00, 而且沒有ORDER BY 來保證取數(shù)的順序, 所以取數(shù)據(jù)順序的細致差異, 就導(dǎo)致了最終結(jié)果的不同. 而最終結(jié)果的不同, 導(dǎo)致了整個游標(biāo)取出來的數(shù)據(jù)不同。

  SELECT ***00)

  KeyID

  FROM tbmaster WITH(NOLOCK)

  WHERE Date >= '01/01/2007'

  AND Date < '02/01/2007')

  在游標(biāo)定義SELECT 語句中, 當(dāng)NOLOCK 有效時, 是可以取到數(shù)據(jù)的, 但NOLOCK 無效(DYNAMIC 游標(biāo)導(dǎo)致)時, 查詢結(jié)果是無數(shù)據(jù)的

  所以最終看到的結(jié)果是: 游標(biāo)循環(huán)不出來數(shù)據(jù), 但只做查詢卻有數(shù)據(jù)。

  如果把游標(biāo)定義中的查詢語句的NOLOCK 去掉做查詢, 也會沒有數(shù)據(jù)(與DYNAMIC 游標(biāo)結(jié)果一致)

  故這個問題嚴格來說不應(yīng)該是兼容級別的問題, 在80 級別下, 還是有可能發(fā)生, 只是機率更小, 或者是內(nèi)部執(zhí)行原理不太一樣, 導(dǎo)致沒有這種情況出來而已

  由于沒有ORDER BY來保證順序, 而有無NOLOCK的數(shù)據(jù)可能不會一樣, 所以80與90下都可能出現(xiàn)問題, 只是90會顯得比較突出, 或者僅僅時正好被發(fā)現(xiàn)了。

  解決方法如下:

  首先,需要把游標(biāo)定義改成下面的,這樣不會導(dǎo)致NOLOCK 失效, 而且速度比原來的定義方式快得多. 如果游標(biāo)一定要與原始表的數(shù)據(jù)變化關(guān)聯(lián)起來, 建議用KEYSET, 或者是去掉NOLOCK 提示(因為沒有意義), 假如對取的數(shù)據(jù)有要求, 我們還應(yīng)當(dāng)考慮加ORDER BY來保證取數(shù)順序:

  DECLARE MyCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC

  FOR

以上就是我要為大家講解的關(guān)于深入講解游標(biāo)類型為什么會產(chǎn)生數(shù)據(jù)檢索的全部內(nèi)容,希望能夠?qū)Υ蠹矣兴鶐椭?/p>

【編輯推薦】

  1. oracle游標(biāo)和游標(biāo)變量的區(qū)別
  2. Oracle游標(biāo)常用屬性
  3. sql server遍歷表不用游標(biāo)和臨時表的方法
責(zé)任編輯:迎迎 來源: 賽迪網(wǎng)
相關(guān)推薦

2009-12-18 18:10:55

Fedora proc

2015-06-10 16:24:42

數(shù)據(jù)檢索

2022-01-18 06:59:50

HashMap循環(huán)底層

2024-07-16 08:03:43

2024-07-08 12:44:11

2009-11-09 09:34:07

WCF集合

2011-03-25 09:27:40

Oracle數(shù)據(jù)庫回滾前退

2023-09-08 09:53:41

API開發(fā)

2019-08-30 10:27:37

數(shù)據(jù)庫通信技術(shù)

2014-12-23 09:34:47

動態(tài)語言

2020-03-27 16:05:49

數(shù)據(jù)庫數(shù)據(jù)MySQL

2022-05-18 08:25:59

MySQLutf8字符集數(shù)據(jù)庫

2022-07-21 08:00:00

京東數(shù)據(jù)存儲汽車行業(yè)

2024-01-24 09:00:00

2024-02-20 08:25:41

Redis內(nèi)存數(shù)據(jù)庫Python

2019-12-16 15:17:13

大數(shù)據(jù)信息安全數(shù)據(jù)庫

2011-08-16 09:07:06

2021-01-18 14:34:59

冪等性接口客戶端

2022-08-04 08:22:49

MySQL索引

2018-08-06 18:36:21

點贊
收藏

51CTO技術(shù)棧公眾號