日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

一句简单的SQL查询语句的背后...

發(fā)布時間:2023/12/31 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一句简单的SQL查询语句的背后... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

當我們在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;(查詢處理器首先進行語法解析,語法檢查,并檢查授權。如果沒有獲得授權執(zhí)行相關的操作,或者語法錯誤,將報錯。)

2.???????? Query Re-writingSemantic Optimization (查詢處理器重新寫SQL語句并做相應的優(yōu)化)。

例如:SELECT Emp.name, Emp.salary
???????????????????????? FROM Emp, Dept
??????????????????????????? WHERE Emp.deptno = Dept.dno

????????????? Join是多余的,查詢處理器會重寫該語句并刪除到表DeptJoin。

3.???????? Compile the SQL into internal query Plan; (編譯SQL到內部查詢計劃)

?????? 數(shù)據(jù)庫會選擇最佳的方法來計算結果集。例如進行全表掃描,或是使用索引(pairs of key and location類似書的目錄)。數(shù)據(jù)庫會比較它們的成本,并形成內部執(zhí)行計劃。數(shù)據(jù)庫內部負責計算選擇最佳執(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ù)頁或索引頁,或是直接緩存命中,這些有緩沖管理器負責... ...)

5.???????? Transaction manager is started as well to ensure the ACID of operations. (事務管理器同時啟動來保證原子操作的并發(fā)一致性, 其他例如鎖管理器、索引管理器、行管理器、頁面文件管理器、緩沖管理器、日志管理器和等也會執(zhí)行,而不是有查詢執(zhí)行器一人包辦所有。)

?

執(zhí)行如下語句:SELECT * FROM t1 WHERE c1=2的簡單過程:

?

1.??????? 掃描t1表,如果是開始則取第一條記錄,否則取下一條記錄;如果讀到表的最后一條記錄了那么跳到第4步。

2.??????? 檢查記錄是否滿足WHERE條件;是則進入第3步,否則回到第1步。

3.??????? 把記錄加到結果集。

4.??????? 返回結果集給客戶端。

?

?

如果表有索引,優(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,排序

?

有關Join

SQL Server employs three types of join operations:

  • Nested loops joins
  • Merge joins
  • Hash joins

?

  • 如果Join的輸入很小,例如小于10行,然后其他的Join輸入很大并且索引在其列上,則Nested loops joins是最快的。(原因參考Understanding Nested Loops Joins)
  • 如果兩個Join輸入都不小,但在索引列上排序(例如是在掃描排序的索引后獲得的 scanning sorted indexes),則Merge joins是最快的。(原因參考Understanding Merge Joins)
  • Hash joins可以有效的處理大量的、沒有排序的、沒有索引的輸入。尤其對復雜查詢的中間結果處理很有效。(更多參考Understanding Hash Joins)
  • ?

    這些只是一些簡單的過程,其實數(shù)據(jù)庫內部執(zhí)行過程是相當復雜的。雖然我們不是數(shù)據(jù)庫開發(fā)人員,但了解上下游的知識是必須的,能夠有助于我們的開發(fā)和應用。技術不僅要知道怎么用,而且要知道為什么,不能知其然不知其所以然。最后附上一張數(shù)據(jù)庫內部簡單結構圖供有興趣的人參考。

    ?

    轉載于:https://www.cnblogs.com/Mainz/archive/2008/07/31/1257000.html

    總結

    以上是生活随笔為你收集整理的一句简单的SQL查询语句的背后...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。