?? microsoft sql server
字號:
作者:怡紅公子
日期:00-6-7 下午 03:35:04
[H1]Microsoft SQL Server 查詢處理器的內(nèi)部機(jī)制與結(jié)構(gòu)[/H1]
Hal Berenson 和 Kalen Delaney
2000 年 1 月
[HR]
[B]摘要:[/B]本文介紹了在客戶機(jī)上處理 Microsoft SQL Server 查詢的方式,各種客戶機(jī)與 SQL Server 的交互方式,以及 SQL Server 在處理客戶機(jī)程序的請求時需要完成的工作。
[H2]簡介[/H2]
Microsoft(R) SQL Server(TM) 內(nèi)部機(jī)制和結(jié)構(gòu)是一個非常大的主題,因此本文僅限于程序開發(fā)人員感興趣的問題,集中研究其他源中沒有徹底討論的問題。在討論 SQL Server 的結(jié)構(gòu)時,我們主要觀察客戶機(jī)的處理過程,研究不同的客戶機(jī)程序與 SQL Server 的交互方式,以及 SQL Server 如何處理客戶機(jī)的請求。還有一些討論 SQL Server 其他方面的信息源,特別是 Microsoft Press 出版的 [I]Inside SQL Server 7.0[/I],作者是 Ron Soukup 和 Kalen Delaney,這本書非常詳細(xì)地討論了 SQL Server 存儲引擎的內(nèi)部機(jī)制和處理方法,不過對查詢處理器的討論不夠深入。本文正填補(bǔ)了這個空白。
我們期望本文有助于讀者編寫出更好的應(yīng)用程序。通過本文,讀者會在提高程序性能方面得到新的啟發(fā),產(chǎn)生新的理解。
[H2]SQL Server 是一種客戶機(jī)/服務(wù)器系統(tǒng)[/H2]
多年來,SQL Server 一直被認(rèn)為是一種客戶機(jī)/服務(wù)器系統(tǒng)。事實上,Sybase DataServer(以此為基礎(chǔ)開發(fā)了原始的 SQL Server)正是第一個作為客戶機(jī)/服務(wù)器系統(tǒng)開發(fā)的商用關(guān)系數(shù)據(jù)庫系統(tǒng)。那這又說明了什么呢?這不只意味著 SQL Server 是一個雙層系統(tǒng)。從傳統(tǒng)上看,雙層系統(tǒng)意味著客戶機(jī)應(yīng)用程序運(yùn)行在一臺機(jī)器上,向另一臺計算機(jī)上的服務(wù)器發(fā)送請求。而對于 SQL Server,客戶機(jī)/服務(wù)器意味著 SQL Server 的[I]組成部分[/I],即客戶機(jī) API 部分,駐留在處理結(jié)構(gòu)中的遠(yuǎn)端,與服務(wù)器組件本身是分開的。
在典型的雙層模型中,客戶機(jī)程序部分駐留在臺式機(jī)上,具有大量客戶機(jī)應(yīng)用程序邏輯和業(yè)務(wù)邏輯,并且會直接向數(shù)據(jù)庫系統(tǒng)發(fā)出請求。然后,客戶機(jī)得到服務(wù)器響應(yīng)這些請求所返回的數(shù)據(jù)。
三層系統(tǒng)也采用了同樣的模型。多年以來,SQL Server 一直用在事務(wù)處理監(jiān)視系統(tǒng)中,例如 BEA 的 Tuxedo 以及 Compaq 的 ACMSxp,這些系統(tǒng)早在二、三十年前就采用了典型的三層模型。三層模型在今天基于 Web 的應(yīng)用系統(tǒng)中占據(jù)了支配地位,這類系統(tǒng)以 Microsoft 的 MTS 以及新的 COM+ 1.0 為代表。從 SQL Server 的角度看,三層解決方案中的客戶機(jī)程序是放在[I]中間[/I]層的。中間層直接與數(shù)據(jù)庫交互。實際的桌面,或瘦客戶機(jī)(Thin Client),使用其他機(jī)制并通常直接與中間層交互,而不是直接與數(shù)據(jù)庫系統(tǒng)交互。圖 1 描述了這種結(jié)構(gòu)。
[img]http://www.microsoft.com/china/msdn/library/techart/sqlquerproc1.gif[/img]
[B]圖 1. 三層系統(tǒng)模型[/B]
[H2]客戶機(jī)結(jié)構(gòu)[/H2]
從結(jié)構(gòu)的角度看,SQL Server 關(guān)系服務(wù)器組件本身并不真正關(guān)心客戶機(jī)程序運(yùn)行的位置。事實上,就 SQL Server 而言,即使在運(yùn)行 SQL Server 的同一臺機(jī)器上運(yùn)行應(yīng)用程序,仍然還是客戶機(jī)/服務(wù)器模型。服務(wù)器運(yùn)行一個單獨的多線程進(jìn)程,為來自客戶機(jī)的請求提供服務(wù),不管客戶機(jī)的位置在哪里。客戶機(jī)程序代碼本身是單獨的運(yùn)行在客戶機(jī)應(yīng)用程序內(nèi)部的 DLL,與 SQL Server 的實際接口是在客戶機(jī)和服務(wù)器之間對話的“表格數(shù)據(jù)流”(Tabular Data Stream, TDS) 協(xié)議。
一個常見的問題是“什么是 SQL Server 的本機(jī)接口呢?”很長時間以來,很多開發(fā)人員一直都不愿意使用 ODBC 這樣的接口,因為他們認(rèn)為由 Sybase 開發(fā)的客戶機(jī) API,也就是 DB-Library,是 SQL Server 的本機(jī)接口。實際上,SQL Server 關(guān)系服務(wù)器本身并沒有本機(jī) API,它的接口就是在客戶機(jī)和服務(wù)器之間的通信流協(xié)議 TDS。TDS 把客戶機(jī)發(fā)送給服務(wù)器的 SQL 語句封裝起來,也把服務(wù)器返回給客戶機(jī)的處理結(jié)果封裝起來。任何直接處理 TDS 的 API 都是 SQL Server 的[I]本機(jī)[/I]接口。
讓我們來看一下客戶機(jī)的組件,如圖 2 所示。客戶機(jī)結(jié)構(gòu)中的某些部分就不在這里討論了,因為它們不屬于 SQL Server 的范疇。但如果您在編寫應(yīng)用程序的話,就必須了解這些部分。大家知道得最多的應(yīng)該是各種對象模型,如果您正在編寫 ASP 或 Microsoft Visual Basic(R) 應(yīng)用程序,就需要通過 ADO 與數(shù)據(jù)庫系統(tǒng)交互,而不是直接調(diào)用底層的 API,例如 ODBC 或 OLE-DB。ADO 映射到 OLE-DB,而 RDO 映射到 ODBC。因此,作為這種最常用的編程模型的對象模型,并不是 SQL Server 客戶機(jī)結(jié)構(gòu)中的嚴(yán)格意義上的組件。此外,還有另外一些組件可以插接到 SQL Server 基礎(chǔ)結(jié)構(gòu)上面的這一層。OLE-DB 的“會話池服務(wù)提供程序 (Session Pooling Service Provider)”就是這種組件的一個例子。
[img]http://www.microsoft.com/china/msdn/library/techart/sqlquerproc2.gif[/img]
[B]圖 2. 客戶機(jī)結(jié)構(gòu)[/B]
[H2]客戶機(jī)接口[/H2]
SQL Server 有兩個接口可以認(rèn)為是 [I][/I]SQL Server[I][/I] 7.0 的本機(jī)接口,即 OLE-DB 和 ODBC。DB-Library 接口也是本機(jī)的,它與 TDS 通信,但是 DB-Library 使用的是 TDS 較老的版本,需要在服務(wù)器上進(jìn)行一些轉(zhuǎn)換。現(xiàn)有的 DB-Library 應(yīng)用程序仍然可以繼續(xù)與 SQL Server 7.0 協(xié)同使用,但是很多新的功能和性能提高等好處只能通過 ODBC 和 OLE DB 才能利用。更新 DB-Library 使其支持 SQL Server 7.0 的新能力,將會導(dǎo)致與現(xiàn)有應(yīng)用程序的很多不兼容性,因此需要修改應(yīng)用程序。ODBC 在五年之前就替代了 DB-Library,是新的 SQL Server 應(yīng)用程序更理想的 API,因此引入不兼容的 DB-Library 新版本并不明智。
從圖 2 可以看到,所有這些客戶機(jī) API 都有三個部分。最上面的部分實現(xiàn) API 的細(xì)節(jié),例如行集和游標(biāo)應(yīng)該是什么樣等等。TDS 格式化程序負(fù)責(zé)處理實際請求,例如 SQL 語句,并將其封裝成 TDS 消息包,發(fā)送給 SQL Server,獲得返回的結(jié)果,然后再把結(jié)果反饋到接口實現(xiàn)。
還有一些供所有提供程序使用的公共庫代碼。例如,BCP 設(shè)備就是 ODBC 和 OLE-DB 都可以調(diào)用的庫。DTC 也是這樣。第三個例子是 ODBC 規(guī)范的 SQL 語法,即帶有參數(shù)標(biāo)記的 CALL 語法,這些對于所有提供程序都是通用的。
除了我們在前面已經(jīng)提到的局限性,即 DB-Library 仍然只能使用 SQL Server 6.5 版,TDS 協(xié)議對于所有 API 都是相同的。ODBC 和 OLE-DB 在與 SQL Server 7.0 通信時使用 SQL Server 7.0 版,但也能夠與 6.5 或 6.0 服務(wù)器通信。另一個是 Net-Library,這是一個抽象層,客戶機(jī)和服務(wù)器都在此層上同網(wǎng)絡(luò)抽象接口通信,不必為 IPX 還是 TCP/IP 困擾。在這里我們將不討論 Net-Library 的工作細(xì)節(jié);只要知道它們的工作基本上是將來自的網(wǎng)絡(luò)通信底層的細(xì)節(jié)隱藏起來不讓軟件的其他部分看到就可以了。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -