SQL Server數(shù)據(jù)庫(kù)分頁(yè)存儲(chǔ)過(guò)程優(yōu)化效率分析
作者:ideas
本文我們通過(guò)一個(gè)實(shí)例來(lái)分析SQL Server數(shù)據(jù)庫(kù)中分頁(yè)存儲(chǔ)過(guò)程的效率,從而找個(gè)更加高效的分頁(yè)方法,以便提高SQL查詢的效率,希望本次的介紹能夠?qū)δ兴鶐椭?/div>
SQL Server數(shù)據(jù)庫(kù)分頁(yè)存儲(chǔ)過(guò)程優(yōu)化效率分析是本文主要要介紹的內(nèi)容,接下來(lái)我們就開(kāi)始介紹這一過(guò)程,SQL Server數(shù)據(jù)庫(kù)分頁(yè)存儲(chǔ)過(guò)程優(yōu)化效率分析先來(lái)對(duì)比兩段分頁(yè)SQL,假設(shè)條件:news表有15萬(wàn)記錄,NewsTypeId=10有9萬(wàn)記錄,當(dāng)前查詢NewsTypeID=10。那么,你會(huì)認(rèn)為哪個(gè)SQL效率會(huì)高呢?
代碼一:
- DECLARE @cc INT
- SELECT NewsId,ROW_NUMBER() OVER(ORDER BY SortNum DESC)
- AS RowIndex INTO #tb FROM news WITH(NOLOCK)
- WHERE NewsTypeId=@NewsTypeId AND IsShow=1
- SET @cc = @@ROWCOUNT
- SELECT n.* FROM news AS n WITH(NOLOCK), #tb
- As t WHERE t.RowIndex>@PageIndex*@PageSize
- AND t.RowIndex<=(@PageIndex+1)*@PageSize
- AND t.newsid=n.newsid
- SELECT @cc
- DROP TABLE #tb
代碼二:
- DECLARE @cc INT
- SELECT NewsId,ROW_NUMBER() OVER(ORDER BY SortNum DESC)
- AS RowIndex INTO #tb FROM news WITH(NOLOCK)
- WHERE NewsTypeId=@NewsTypeId AND IsShow=1
- SET @cc = @@ROWCOUNT
- SELECT NewsId INTO #tb2 FROM #tb As t
- WHERE t.RowIndex>@PageIndex*@PageSize AND t.RowIndex<=(@PageIndex+1)*@PageSize
- SELECT * FROM news WITH(NOLOCK)
- WHERE NewsId IN (SELECT * FROM #tb2)
- SELECT @cc
- DROP TABLE #tb
- DROP TABLE #tb2
答案是代碼二遠(yuǎn)遠(yuǎn)高于代碼一。在代碼一中加粗代碼的操作會(huì)引起整表掃描,因?yàn)閿?shù)據(jù)庫(kù)引擎在認(rèn)為WHERE表達(dá)式中滿足條件記錄大于一定閥值的時(shí)候,就不再去進(jìn)行查詢優(yōu)化,而直接使用表掃描??磮?zhí)行信息:
- 表 'news'。掃描計(jì)數(shù) 1,邏輯讀取 342 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
- (98361 行受影響)
- (1 行受影響)
- (40 行受影響)
- 表 '#tb________________________________________00000004C024'。
- 掃描計(jì)數(shù) 1,邏輯讀取 257 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
- 表 'news'。掃描計(jì)數(shù) 1,邏輯讀取 2805 次,物理讀取 0 次,預(yù)讀 235 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
- (1 行受影響)
- (1 行受影響)
- 原本,我想的執(zhí)行計(jì)劃,加粗部分的代碼應(yīng)該是聚焦索引查找,這樣性能就提高很多??创a二:
- 表 'news'。掃描計(jì)數(shù) 1,邏輯讀取 342 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
- (98361 行受影響)
- (1 行受影響)
- 表 '#tb____________________________________00000004BEEF'。
- 掃描計(jì)數(shù) 1,邏輯讀取 257 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
- (40 行受影響)
- (1 行受影響)
- (40 行受影響)
- 表 'news'。掃描計(jì)數(shù) 0,邏輯讀取 131 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
- 表 '#tb2___________________________________00000004BEF0'。
- 掃描計(jì)數(shù) 1,邏輯讀取 2 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
- (1 行受影響)
- (1 行受影響)
很明顯,代碼二與代碼一中的IO操作數(shù)大大降低。且代碼一隨著@PageIndex越來(lái)越大,效率會(huì)越來(lái)越低;但代碼二的效率不會(huì)隨@PageIndex變化而改變。
以上就是SQL Server數(shù)據(jù)庫(kù)分頁(yè)存儲(chǔ)過(guò)程優(yōu)化效率分析的全部?jī)?nèi)容,本文就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】
責(zé)任編輯:趙鵬
來(lái)源:
博客園


相關(guān)推薦




