一句简单的SQL查询语句的背后...
當(dāng)我們在SQL Server Management Studio的查詢里面輸入: SELECT * FROM t1 WHERE c1=2;
背后發(fā)生了什么?數(shù)據(jù)庫怎么去執(zhí)行查詢的? -? 知其然不知其所以然。
?
1.???????? Query Parsing, Synatax Error Check, and Authorization: Query Processer check the user is authorized to run the query;(查詢處理器首先進(jìn)行語法解析,語法檢查,并檢查授權(quán)。如果沒有獲得授權(quán)執(zhí)行相關(guān)的操作,或者語法錯誤,將報錯。)
2.???????? Query Re-writing,Semantic Optimization; (查詢處理器重新寫SQL語句并做相應(yīng)的優(yōu)化)。
例如:SELECT Emp.name, Emp.salary
 ???????????????????????? FROM Emp, Dept
 ??????????????????????????? WHERE Emp.deptno = Dept.dno 
????????????? Join是多余的,查詢處理器會重寫該語句并刪除到表Dept的Join。
3.???????? Compile the SQL into internal query Plan; (編譯SQL到內(nèi)部查詢計劃)
?????? 數(shù)據(jù)庫會選擇最佳的方法來計算結(jié)果集。例如進(jìn)行全表掃描,或是使用索引(pairs of key and location,類似書的目錄)。數(shù)據(jù)庫會比較它們的成本,并形成內(nèi)部執(zhí)行計劃。數(shù)據(jù)庫內(nèi)部負(fù)責(zé)計算選擇最佳執(zhí)行計劃的組件叫優(yōu)化器(Optimizer)。
4.???????? The query plan is handled by plan executor, which consists of many operators, e.g. joining, sorting, grouping... (查詢計劃被計劃執(zhí)行器執(zhí)行。計劃執(zhí)行器包含很多操作者,例如執(zhí)行Join, Sort, Group等,還要有訪問方法管理器來決定存取哪些數(shù)據(jù)頁或索引頁,或是直接緩存命中,這些有緩沖管理器負(fù)責(zé)... ...)
5.???????? Transaction manager is started as well to ensure the ACID of operations. (事務(wù)管理器同時啟動來保證原子操作的并發(fā)一致性, 其他例如鎖管理器、索引管理器、行管理器、頁面文件管理器、緩沖管理器、日志管理器和等也會執(zhí)行,而不是有查詢執(zhí)行器一人包辦所有。)
?
執(zhí)行如下語句:SELECT * FROM t1 WHERE c1=2的簡單過程:
?
1.??????? 掃描t1表,如果是開始則取第一條記錄,否則取下一條記錄;如果讀到表的最后一條記錄了那么跳到第4步。
2.??????? 檢查記錄是否滿足WHERE條件;是則進(jìn)入第3步,否則回到第1步。
3.??????? 把記錄加到結(jié)果集。
4.??????? 返回結(jié)果集給客戶端。
?
?
如果表有索引,優(yōu)化器可能比較全表掃描和索引,并可能決定執(zhí)行計劃為掃描索引。則步驟類似,不過第1步變成:
掃描索引(Clustered or no-clustered)并定位到記錄。
?
例如:
?SELECT * FROM Customers WHERE contactID IN
(SELECT contactID FROM Contacts WHERE contactID=86)
ORDER BY CustomerName DESC;
?
增加的步驟有:
1.??????? 在表[Contacts]中掃描索引并定位記錄。
2.??????? 在表[Customers]中掃描索引并定位記錄。
3.??????? Hash match (inner join),哈希匹配,連接。
4.??????? Sort,排序
?
有關(guān)Join
SQL Server employs three types of join operations:
- Nested loops joins
- Merge joins
- Hash joins
?
?
這些只是一些簡單的過程,其實(shí)數(shù)據(jù)庫內(nèi)部執(zhí)行過程是相當(dāng)復(fù)雜的。雖然我們不是數(shù)據(jù)庫開發(fā)人員,但了解上下游的知識是必須的,能夠有助于我們的開發(fā)和應(yīng)用。技術(shù)不僅要知道怎么用,而且要知道為什么,不能知其然不知其所以然。最后附上一張數(shù)據(jù)庫內(nèi)部簡單結(jié)構(gòu)圖供有興趣的人參考。
?
轉(zhuǎn)載于:https://www.cnblogs.com/Mainz/archive/2008/07/31/1257000.html
總結(jié)
以上是生活随笔為你收集整理的一句简单的SQL查询语句的背后...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 《编程之美》读书笔记(十):“链表相交”
- 下一篇: 用C#编写网页小应用程序(Applet)
