成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

教你如何優化SQL語句中的物理查詢

運維 數據庫運維 SQL Server
作者將教大家如何優化SQL語句中的物理查詢,包括分析檢查語法并把SQL批處理轉化成分析樹、代數化(algebrization)以及查詢優化三個步驟。

有幾位朋友有這樣的疑問:

select * 
from tab1, tab2
where tab1.id = tab2.id and tab1.col1 = 123 and tab2.col1 = 'abc'

照你所述的執行順序,先要tab1和tab2進行笛卡爾乘積,再按照tab1.col1 = 123 and tab2.col1 = 'abc'進行篩選。這樣的話,效率豈不是很低,數據庫有這么愚蠢嗎?

我想很多人都會有這個疑問,包括我在最初學習的時候也提出過這樣的問題。那么,我的這篇文章就結合這個問題來討論一下SQL Server的物理查詢處理。首先我們必須明白邏輯處理和物理處理和區別,邏輯處理是指執行一個查詢應該產生什么樣的結果,那么邏輯查詢的各個階段就是這個查詢從邏輯上執行的先后順序,依照這個先后順序就能得到正確的結果,正如我們做四則混合運算一樣,先乘除后加減才能得到正確結果。

所以說邏輯查詢只關心產生一個我們期望的、正確的結果,它并不關心產生這個結果需要多少的資源消耗。而物理處理就是怎么得到這個結果,這個時候才會考慮性能問題。下面我們就討論下怎么執行這個物理處理的。

當一個查詢到達數據庫引擎的時候,數據庫引擎需要做的是執行這個查詢的查詢計劃,那么這個時候就存在兩種情況,一種可能是這個查詢的查詢計劃已經在緩存中,這種情況就直接執行這個查詢計劃。另外一種情況就是在緩存中找不到該查詢的查詢計劃。沒有怎么辦?生成一個!怎么生成?

執行計劃是在編譯階段生成的,編譯需要經過三個步驟:分析、代數化(algebrization)、查詢優化,看見沒有這里的查詢優化過程就能解決上面的朋友提出的先笛卡爾集在篩選造成性能低的問題。下面我就對這三個步驟作一個介紹。

***步:分析是檢查語法并把SQL批處理轉化成分析樹的過程,如select * t1 where id in(1,2,3,4,5,6,7)在被分析樹分析后就展開成了select * t1 where id=1 or id=2 or id=3 or id=4 or id=5 or id=6 or id=7 ,除此之外還有檢查語法是否正確的功能。

第二步:接下的過程是代數化(algebrization),這個階段使用SQL Server 2005的新組件algebrizer,algebrizer組件的主要功能是綁定,因此代數化過程通常稱為綁定。這個階段是將***步的分析樹作為輸入,生成被稱為查詢處理器樹的輸出,用于查詢優化。其實這個階段主要做幾個事情,

一:運算符平展,簡單的講就是把二元運算符組合成N元運算符,這里必須給出一個示例才能很好的解釋這個二元轉換成N元如***步所示in操作展開成了一連串的or運算符,而分析器認為這些or都是二元的,也就是說它認為***個or 的左孩子是id=1,右孩子是 (id=2 or id=3 or id=4 or id=5 or id=6 or id=7 )這個表達式,而右孩子又被認為是二元的,如此一來就必須進行一個遞歸過程。而運算符平展過程則將這種二元運算組合成n元運算符,就避免了遞歸的過程。

二:名稱解析,這個過程其實就是檢查這個查詢中出現的表或者是表的列是不是在數據庫中真實存在。以及在該查詢過程中是不是可見的。三:類型派生,有點抽象,舉個例子就能理解了,比如union查詢吧,union左右兩邊查詢結果對應位置的數據類型應該是一致的。四:聚合綁定和組分綁定,執行完這個步驟后查詢處理器樹便生成了。

第三步:查詢優化,這個過程由查詢優化器組件來完成的。查詢中應該以何種順序訪問表,使用哪種方法和使用哪個索引,應該由哪個聯接算法等都是由查詢優化器組件來決定的,但是這個決定也不是隨意的,它必須滿足的前提條件是保證***得到的結果集必須是正確的,也就是說該結果集必須遵循邏輯處理的各個階段所得到的結果集相同。優化器會嘗試該查詢的許多變體,一查找成本***的計劃。

如果優化器分析該查詢的元數據得知只有一個可執行的計劃,那么它就不會再嘗試尋求更好的計劃,這個步驟叫做細微計劃優化。如果沒有找到細微計劃優化,SQL Server將執行一些簡化,簡化就是對自身語法作一些轉換,比如在聯接前計算表的where篩選器,如前一篇描述的,邏輯查詢中where篩選總是在聯接之后計算,但是先計算where篩選器在聯接同樣能得到的正確的結果,而這樣的效率往往是更高的,所以在物理處理中where往往在join前執行的,開篇提到的那個問題只是讀者未理解邏輯處理和物理處理的差別而已。

到此為止,物理處理的各個步驟也做了一個簡要的敘述,總結下,無論是存儲過程還是即席查詢都是執行的一個查詢計劃的副本,如果這個查詢計劃不存在的話就必須經過編譯生成一個執行計劃,在編譯階段必須經過分析,綁定(代數化),查詢優化這些過程,最終得到我們需要查找的結果。關于查詢優化組件具體是怎么優化查詢處理器樹的,我會在以后的篇幅作詳細介紹。

【編輯推薦】

  1. 詳解如何刪除SQL Server表中的重復行
  2. 用并行查詢讓SQL Server加速運行
  3. SQL Server 2005常見問題淺析
責任編輯:彭凡 來源: 博客園
相關推薦

2011-09-08 16:30:59

SQL Server查詢

2018-09-20 11:54:31

數據庫MySQL性能優化

2010-09-03 15:47:40

SQL語句鎖定

2010-09-03 14:39:15

SQLSELECT語句

2010-09-07 13:41:50

SQL語句

2010-09-07 16:38:36

SQL語句SELECT DIST

2010-09-03 11:25:58

SQL刪除

2010-09-03 14:47:50

SQLSELECT語句

2009-04-13 16:35:25

TSQL查詢SQL Server

2016-12-15 09:58:26

優化SQL高性能

2017-07-12 13:04:23

數據庫SQL查詢執行計劃

2010-11-25 15:57:49

mysql查詢語句

2009-09-17 09:45:36

LINQ查詢語句

2010-04-13 14:43:37

Oracle性能檢測

2010-09-07 10:19:31

SQL語句

2010-09-07 14:56:49

SQL語句CASE WHEN

2020-09-21 08:32:03

JavaSQL公共字段

2017-09-07 16:20:39

SQL查詢語句查詢優化

2022-03-23 14:04:32

SQL字符串數據類型

2022-05-19 23:40:34

SQL語句引號
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久中文 | 国产亚洲一区二区精品 | 久久九精品 | 亚洲免费网 | 久久国| 激情久久网 | 国产在线一区二区 | 欧美一区不卡 | 亚洲网站在线观看 | 毛片免费看 | 国产精品视频免费看 | 婷婷毛片 | 噜噜噜噜狠狠狠7777视频 | 亚洲热在线视频 | 91黄在线观看| 国产目拍亚洲精品99久久精品 | www.亚洲一区二区 | 亚洲视频在线观看 | 欧美一区二区三区在线观看 | 日本不卡免费新一二三区 | 国产精品色综合 | 亚洲视频在线看 | 久久久久久久久久久91 | 国产精品视频网 | 久久毛片 | 91av免费版| 国产日韩一区二区三区 | 免费一区二区 | 红色av社区 | 天堂一区二区三区四区 | 国产三级精品视频 | 高清一区二区三区 | 久久久久久久一区 | 99精品国产一区二区青青牛奶 | 精品av | 欧美freesex黑人又粗又大 | 欧美视频三区 | 亚洲综合大片69999 | 欧美jizzhd精品欧美巨大免费 | 91麻豆精品国产91久久久资源速度 | 久久精品国产一区二区三区不卡 |