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

詳解用TSQL在SQL Server實(shí)現(xiàn)物理查詢數(shù)據(jù)流

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維 SQL Server
TSQL是目前全球數(shù)據(jù)庫(kù)語句中最強(qiáng)大的一種數(shù)據(jù)庫(kù)語句,目前世界所有SQL數(shù)據(jù)庫(kù)的語句都是按照TSQL標(biāo)準(zhǔn)執(zhí)行的,使用TSQL語句可以在命令執(zhí)行工具上迅速的按照語句的執(zhí)行標(biāo)準(zhǔn)精確對(duì)SQL數(shù)據(jù)庫(kù)進(jìn)行增、刪、改、查。本文將介紹在SQL Server下進(jìn)行物理查詢。

當(dāng)一個(gè)查詢到達(dá)數(shù)據(jù)庫(kù)引擎時(shí),SQL Server執(zhí)行兩個(gè)主要的步驟來產(chǎn)生結(jié)果。***步是查詢編譯,他生成查詢計(jì)劃;第二部執(zhí)行這個(gè)查詢計(jì)劃。

查詢編譯由三個(gè)步驟組成:分析、代數(shù)化及查詢優(yōu)化。然后編譯器把經(jīng)過優(yōu)化的查詢計(jì)劃保存到過程緩存中。然后執(zhí)行引擎把該計(jì)劃轉(zhuǎn)換為可執(zhí)行的形式,然后執(zhí)行其中的步驟以生成查詢結(jié)果。如果今后再執(zhí)行相同的查詢或存儲(chǔ)過程時(shí),過程緩存已經(jīng)包含了該計(jì)劃,則跳過編譯步驟,直接重用緩存的計(jì)劃來執(zhí)行該查詢或存儲(chǔ)過程。

安裝Northwind數(shù)據(jù)庫(kù),點(diǎn)選“包括實(shí)際的執(zhí)行計(jì)劃”并執(zhí)行以下查詢:

USE Northwind;

GO

SELECT C.CustomerID, COUNT(O.OrderID) AS NumOrders

FROM dbo.Customers AS C

LEFT OUTER JOIN dbo.Orders AS O

ON C.CustomerID = O.CustomerID

WHERE C.City = 'London'

GROUP BY C.CustomerID

HAVING COUNT(O.OrderID) > 5

ORDER BY NumOrders;

生成結(jié)果:

執(zhí)行計(jì)劃流程圖:

未標(biāo)題-1副本.png

文本形式的執(zhí)行計(jì)劃輸出:

|--Sort(ORDER BY:([Expr1004] ASC))

|--Filter(WHERE:([Expr1004]>(5)))

|--Compute Scalar(DEFINE:([Expr1004]=CASE WHEN [Expr1004] IS NULL THEN (0) ELSE [Expr1004] END))

|--Nested Loops(Left Outer Join, OUTER REFERENCES:([C].[CustomerID]))

|--Index Seek(OBJECT:([Northwind].[dbo].[Customers].[City] AS [C]),

SEEK:([C].[City]=N'London') ORDERED FORWARD)

|--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[Expr1009],0)))

|--Stream Aggregate(DEFINE:([Expr1009]=Count(*)))

|--Index Seek(OBJECT:([Northwind].[dbo].[Orders].[CustomersOrders] AS [O]), SEEK:([O].

[CustomerID]=[Northwind].[dbo].[Customers].[CustomerID] as [C].[CustomerID]) ORDERED FORWARD)

計(jì)劃中的分支是交叉執(zhí)行的。該示例中SQL Server交替執(zhí)行嵌套循環(huán)的兩個(gè)分支。

灰色箭頭表示數(shù)據(jù)流,箭頭的粗細(xì)表示查詢優(yōu)化器估計(jì)通過該連接傳遞的行數(shù)。

引擎先對(duì)Customers表執(zhí)行索引查找,他將選擇來自London的***個(gè)消費(fèi)者。可以查看此部操作的詳細(xì)信息,如下圖。

未標(biāo)題-2.png

可以看到此步的查找謂詞的前綴為:

[Northwind].[dbo].[Customers].[City] = N'London

被選擇的行被傳遞到嵌套循環(huán)運(yùn)算符,嵌套循環(huán)則會(huì)開始進(jìn)行內(nèi)層循環(huán)的運(yùn)算。內(nèi)層循環(huán)由計(jì)算標(biāo)量、流聚合、索引查找組成。

查看一下內(nèi)層循環(huán)的***步,索引查找的詳細(xì)信息,如下圖:

未標(biāo)題-2.png

查找謂詞的前綴為:

[Northwind].[dbo].[Orders].CustomerId =

([Northwind].[dbo].[Customers].CustomerID as [C].CustomerID)

我們看到C.CustomerID的值被用于查找Orders表以獲得該CustomerID的所有訂單。也就是說嵌套循環(huán)的內(nèi)側(cè)引用了從外側(cè)得到的值。

緊接著,查詢會(huì)在找到來自London的***個(gè)消費(fèi)者的所有訂單之后,將這些訂單傳遞給流聚合運(yùn)算符進(jìn)行統(tǒng)計(jì)。從文本形式的執(zhí)行計(jì)劃輸出上可以很好的理解流聚合在這里做了什么。

|--Stream Aggregate(DEFINE:([Expr1009]=Count(*)))

其實(shí)他就是數(shù)了一下,有多少個(gè)訂單。

然后是計(jì)算標(biāo)量的操作:

|--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[Expr1009],0)))

其實(shí)就是做了一下類型轉(zhuǎn)換。

然后,內(nèi)側(cè)操作的結(jié)果會(huì)保存到外側(cè)的那行中,說白了就是把London的***個(gè)消費(fèi)者的訂單數(shù)量存在這個(gè)消費(fèi)者對(duì)象之中。

那么是不是當(dāng)所有的嵌套循環(huán)執(zhí)行完成后,形成了一個(gè)由(消費(fèi)者,該消費(fèi)者的訂單個(gè)數(shù))這樣的結(jié)構(gòu)所組成的數(shù)組呢?答案是否定的,因?yàn)橛?jì)劃中的分支是交叉執(zhí)行的。當(dāng)一個(gè)消費(fèi)者完成了數(shù)數(shù)的工作,也完成他自己在前4步的操作,進(jìn)入左上角的計(jì)算標(biāo)量運(yùn)算符中。

那么然后,由左上角的計(jì)算標(biāo)量來處理這個(gè)數(shù)據(jù),這個(gè)步驟就是做了一下值的檢查:

|--Compute Scalar(DEFINE:([Expr1004]=CASE WHEN [Expr1004] IS NULL THEN (0) ELSE [Expr1004] END))

這里的[Expr1004]在之前已經(jīng)定義過,還記得吧,首先是求某一個(gè)消費(fèi)者的所有訂單數(shù),然后把值做了類型轉(zhuǎn)換。這里又增加了一些判斷:如果[Expr1004]是NULL則返回0,否則則執(zhí)行之前的[Expr1004]。

接著,將結(jié)果傳遞給篩選器運(yùn)算符

未標(biāo)題-2.png

文本形式的執(zhí)行計(jì)劃輸出

|--Filter(WHERE:([Expr1004]>(5)))

這里很好理解,就是對(duì)這條數(shù)據(jù)進(jìn)行謂詞操作,如果值不為真,則移除掉該數(shù)據(jù)。

終于,數(shù)據(jù)到達(dá)了排序運(yùn)算符。大家應(yīng)該可以想到,在所有要被排序的行全部就緒之前進(jìn)行排序是沒有意義的,因此這些行會(huì)在排序這一步進(jìn)行等待,也就是說如果對(duì)Customers表的索引查找操作又找到一個(gè)來自London的消費(fèi)者,將重復(fù)執(zhí)行上述過程,直到所有要返回的行到達(dá)了排序運(yùn)算符后,將按正確的順序返回這些行。

未標(biāo)題-2.png

文本形式的執(zhí)行計(jì)劃輸出:

|--Sort(ORDER BY:([Expr1004] ASC))

【編輯推薦】

  1. 淺談SQL Server數(shù)據(jù)庫(kù)并發(fā)測(cè)試方法
  2. 淺談SQL Server觸發(fā)器的使用
  3. 詳解SQL Server 2005四種排名函數(shù)
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

2009-04-28 09:38:53

SQL優(yōu)化物理查詢

2009-08-19 10:41:12

Java輸入數(shù)據(jù)流

2019-12-19 14:38:08

Flink SQL數(shù)據(jù)流Join

2009-04-30 09:28:05

SynonymOpenquerySQL Server

2011-08-19 16:07:33

SQL Server數(shù)據(jù)流

2010-06-30 10:15:40

SQL Server

2010-10-11 09:05:40

SQL Server

2011-08-29 10:19:09

Microsoft S控制較大數(shù)據(jù)流

2011-08-30 11:04:30

鏈接查詢內(nèi)連接外連接

2009-03-17 13:25:13

查詢遷移SQL Server

2010-09-10 08:54:02

2011-12-14 15:57:13

javanio

2010-10-21 10:28:13

SQL Server查

2011-09-01 18:38:02

SQL Server 文件流功能

2022-03-18 08:57:17

前端數(shù)據(jù)流選型

2022-04-26 16:48:44

ConfluentRBAC數(shù)據(jù)流

2011-08-10 10:06:54

存儲(chǔ)過程SQL Server IP地址歸屬地查詢

2011-07-13 16:19:54

存儲(chǔ)過程SQL Server數(shù)

2010-11-09 09:43:20

SQL Server查

2016-11-14 19:01:36

數(shù)據(jù)流聊天系統(tǒng)web
點(diǎn)贊
收藏

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