sql 2012之後分頁查詢速度問題

2022-05-08 02:54:08 字數 4005 閱讀 7396

一.sql server 2012使用offset/fetch next分頁,比sql server 2005/2008中的rownumber()有顯著改進。今天特地作了簡單測試,現將過程分享如下:

dbcc

dropcleanbuffers

dbcc

freeproccache

setstatistics io on

;set

statistics time on;go

declare

@page

int, @size

intselect

@page

=3, @size=10

;with cte as

(select

top (@page

*@size

)customerid,

customername,

customercity,

row_number()

over(order

by customername ) as

seq,

count(*) over(partition by

'') as

total

from

customers

where customercity in ('

a-city

','b-city')

order

by customername asc

)select

*from

ctewhere seq between (@page

-1 ) *

@size+1

and@page

*@size

order

byseq;

select*,

count(*) over(partition by

'') as

total

from

customers

where customercity in ('

a-city

','b-city')

order

bycustomerid

offset (

@page

-1) *

@size

rows

fetch

next

@size rows only;go

setstatistics io off

;set

statistics time off

;go

結果:

二.統計資訊解釋

在平時優化sql的時候,最長用的就是:set statistics on,它可以用來檢視我們寫的查詢語句到底效能如何,不過,究竟這個效能的指標是怎麼樣的呢?首先需要明白的,就是各項資料的意義。

輸出項含義

table

表的名稱。

scan count

執行的掃瞄次數。

logical reads

從資料快取讀取的頁數。

physical reads

從磁碟讀取的頁數。

read-ahead reads

為進行查詢而放入快取的頁數。

lob logical reads

從資料快取讀取的textntextimage或大值型別 (varchar(max)nvarchar(max)varbinary(max)) 頁的數目。

lob physical reads

從磁碟讀取的textntextimage或大值型別頁的數目。

lob read-ahead reads

為進行查詢而放入快取的textntextimage或大值型別頁的數目。

掃瞄計數(scan count):在查詢中涉及到的表被訪問的次數。在我們的例子中,其中的表只被訪問了1次,由於查詢中不包括連線命令,這一資訊並不是十分有用,但如果查詢中包含有乙個或多個連線,則這一資訊是十分有用的。(乙個迴圈外部的表的scan count值為1,但對於乙個迴圈內的表而言,其值為迴圈的次數。可以想象得到,對於乙個迴圈內的表而言,其scan count值越小,它所使用的資源越少,查詢的效能也就越高。因此在調節乙個帶連線的查詢的效能時,需要關注scan count的值,在進行調節時,注意觀察它是增加還是減少了。)

邏輯讀取(logical reads):這是set statistics io或set statistics time命令提供的最有用的 資料。我們知道,sql server在可以對任何資料進行操作前,必須首先把資料讀取到其資料緩衝區中。此外,我們也知道sql server何時會從資料緩衝區中讀取資料,並把資料讀取到大小為8k位元組的頁中。那麼logical reads的意義是什麼呢?logical reads是指sql server為得到查詢中的結果而必須從資料緩衝區讀取的頁數。在執行查詢時,sql server不會讀取比實際需求多或少的資料,因此,當在相同的資料集上執行同乙個查詢,得到的logical reads的數字總是相同的。(sql server執行查詢時的logical reads值每一次這個數值是不會變化的。因此,在進行查詢效能的調節時,這是乙個可以用來衡量你的調節措施是否成功的乙個很好的標準。如果 logical reads值下降,就表明查詢使用的伺服器資源減少,查詢的效能有所提高。如果logical reads值增加,則表示調節措施降低了查詢的效能。在其他條件不變的情況下,乙個查詢使用的邏輯讀越少,其效率就越高,查詢的速度就越快。)

物理讀取(physical reads):物理讀,在執行真正的查詢操作前,sql server必須從磁碟上向資料緩衝區中讀取它所需要的資料。在sql server開始執行查詢前,它要作的第一件事就是檢查它所需要的資料是否在資料緩衝區中,如果在,就從中讀取,如果不在,sql server必須首先將它需要的資料從磁碟上讀到資料緩衝區中。我們可以想象得到,sql server在執行物理讀時比執行邏輯讀需要更多的伺服器資源。因此,在理想情況下,我們應當盡量避免物理讀操作。下面的這一部分聽起來讓人容易感到糊塗 了。在對查詢的效能進行調節時,可以忽略物理讀而只專注於邏輯讀。你一定會納悶兒,剛才不是還說物理讀比邏輯讀需要更多的伺服器資源嗎?情況確實是這樣, sql server在執行查詢時所需要的物理讀次數不可能通過效能調節而減少的。減少物理讀的次數是dba的一項重要工作,但它涉及到整個伺服器效能的調節,而 不僅僅是查詢效能的調節。在進行查詢效能調節時,我們不能控制資料緩衝區的大小或伺服器的忙碌程度以及完成查詢所需要的資料是在資料緩衝區中還是在磁碟 上,唯一我們能夠控制的資料是得到查詢結果所需要執行的邏輯讀的次數。因此,在查詢效能的調節中,我們可以心安理得地不理會set statistics io命令提供的physical read的值。(減少物理讀次數、加快sql server執行速度的一種方式是確保伺服器的物理記憶體足夠多。)

預計(read-ahead reads):與physical reads一樣,這個值在查詢效能調節中也沒有什麼用。read-ahead reads表示sql server在執行預讀機制時讀取的物理頁。為了優化其效能,sql server在認為它需要資料之前預先讀取一部分資料,根據sql server對資料需求**的準確程度,預讀的資料頁可能有用,也可能沒用。

SQL 2012新版分頁儲存

sql 2012新版分頁儲存 alter procedure dbo pagingstoredprocedure tablename varchar max 表名 fields varchar 2000 返回字段 多個以逗號分隔 keyfield varchar 2000 唯一鍵,為空時採用row ...

SQL 2012中文亂碼

ms sql插入漢字的時候。常常會遇到部分漢字變成了亂碼問號了,所以在安裝資料庫或者在建立表的時候須要注意一下幾點 1 儲存漢字的字段要用nvarchar nchar ntext等。插入的時候要用n 漢字 2 安裝資料庫的時候,選擇chinese prc ci as排序規則,假設是其它的排序規則能夠...

Sql2012資料庫還原

sql2012資料庫還原 通過.bak資料庫備份檔案 昨天系統掛了,那叫乙個悲慘,重灌了系統,但是sql2012的資料沒有備份,同事幫忙發來備份檔案 bak 開始還原資料。步驟 1 自己新建乙個資料庫,這個資料庫就是最終還原的資料庫。圖1 圖一2 右擊 shu ju huan yuan 資料庫 任務...