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

說說Top子句對查詢計劃的影響

運維 數(shù)據(jù)庫運維 SQL Server
之前我們談論過SQL數(shù)據(jù)庫中"簡單的"SELECT TOP中大家可能沒有注意到的細節(jié)。今天將和大家分享Top子句對查詢計劃的影響——簡單說慎用TOP。

1子查詢的影響

Nest loop適用于被連接的數(shù)據(jù)

如果兩個表做join操作,會有三種join方式: Nested join, Merge Join, Hash Join

Nested Join適用于結(jié)果集較小表

Hash Join適用于結(jié)果集很大的表

示例如下

  1. create table moderatetable1(id int identity(1,1) primary key, c1 int ,c2 int,c3 int,c4 int)  
  2. create table moderatetable2(id int identity(1,1) primary key, c1 int ,c2 int,c3 int,c4 int)  
  3. declare @n int=0  
  4. while @n<100000  
  5. begin 
  6. insert moderatetable1(c1,c2,c3,c4) values(@n,@n,@n,@n)  
  7. insert moderatetable2(c1,c2,c3,c4) values(@n,@n,@n,@n)  
  8. set @n+=1  
  9. end 
  10. create index index1 on moderatetable1(C1)  
  11. create index index1 on moderatetable2(C2)  
  12. go  
  13. set statistics io on 
  14. select t1.c1 from moderatetable1 t1 inner join moderatetable2 t2  
  15. on t1.c1=t2.c1  
  16. go 

下圖是上面查詢的執(zhí)行計劃和io統(tǒng)計信息

 

IO情況

(100000 行受影響)

表 'Worktable'。掃描計數(shù) 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

表 'moderatetable2'。掃描計數(shù) 1,邏輯讀取 361 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

表 'moderatetable1'。掃描計數(shù) 1,邏輯讀取 176 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

如果只想取前50行,可以指定top 50:

  1. select top 50 t1.c1 from moderatetable1 t1 inner join moderatetable2 t2 
  2. on t1.c1=t2.c1

 

(50 行受影響)

表 'moderatetable1'。掃描計數(shù) 50,邏輯讀取 124 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

表 'moderatetable2'。掃描計數(shù) 1,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

我們看到,當指定了top 50之后,查詢計劃成了nested join. 當使用TOP時,SQLSEVER會認為這是一個較小的數(shù)據(jù)集,所以會使用nested join.對于這個查詢,IO的開銷比較李小. 但SQLSERVER經(jīng)常會估計錯誤(即使統(tǒng)計信息是正確的).

我們看一下下面的查詢:

  1. select top 500 t1.c1 from moderatetable1 t1 inner join moderatetable2 t2  
  2. on t1.c1=t2.c1 
 

 

(500 行受影響)

表 'moderatetable1'。掃描計數(shù) 500,邏輯讀取 1080 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

表 'moderatetable2'。掃描計數(shù) 1,邏輯讀取 4 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

返回行數(shù)增加到了500,SQLSERVER仍然使用nested join,得到了較差的IO

隨著TOP的行數(shù)的增多,IO開銷會越來越大. 但也不是總是這樣,當top值達到一個臨界點后,執(zhí)行計劃會變更成hash join.

  1. select top 20000 t1.c1 from moderatetable1 t1 inner join moderatetable2 t2  
  2. on t1.c1=t2.c1 

 

(20000 行受影響)

表 'Worktable'。掃描計數(shù) 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

表 'moderatetable2'。掃描計數(shù) 1,邏輯讀取 74 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

表 'moderatetable1'。掃描計數(shù) 1,邏輯讀取 176 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

(1 行受影響)

慎用TOP ...

原文鏈接:http://www.cnblogs.com/stswordman/archive/2011/06/14/2080396.html

【編輯推薦】

  1. 分析TOP語句放到表值函數(shù)外,效率異常低下的原因
  2. 雙TOP二分法生成分頁SQL類
  3. SQL Server數(shù)據(jù)庫中簡單的SELECT TOP
  4. 利用top構(gòu)造Sql Server分頁查詢
責任編輯:艾婧 來源: stswordman的博客
相關推薦

2011-08-04 13:07:59

數(shù)據(jù)庫查詢TOP子句

2020-12-04 07:51:24

CQRS模型查詢

2009-09-16 13:02:12

LINQ查詢子句

2017-09-22 11:01:00

Oracle數(shù)據(jù)庫中直方圖

2010-04-02 15:04:14

Oracle遞歸查詢

2013-09-29 09:49:04

編程生活方式

2011-06-01 17:45:22

SEO

2015-11-04 14:03:44

BYOD自帶設備企業(yè)

2011-05-06 16:22:58

2009-06-12 09:44:04

LINQ查詢復合from子句

2009-08-27 13:10:54

LINQ from子句

2013-03-28 10:53:11

2014-07-22 09:25:48

LTEPTN4G

2022-09-27 15:00:18

物聯(lián)網(wǎng)IoT

2022-11-17 08:00:18

JavaScript錯誤性能

2021-07-16 07:57:34

ReduxDOM組件

2021-11-25 10:18:42

RESTfulJava互聯(lián)網(wǎng)

2011-05-24 16:01:51

OpenFlow影響

2021-10-13 22:38:42

數(shù)字貨幣貨幣人類

2022-12-15 08:00:38

JavaScript錯誤性能
點贊
收藏

51CTO技術棧公眾號