PostgreSQL查詢最佳化:查詢條件最佳化一(條件分類)

來源:互聯網
上載者:User

在SQL中,查詢條件在查詢最佳化階段需要被分成三種類型,三類條件有不同的作用,在某些情況下,可以相互轉化。
首先說明一下SQL語句的執行步驟,可以分為三步:一,讀取表中的元組;二,如果有JOIN,則開始做JOIN;三,針對WHERE條件作過濾。我們以簡單的SQL為例:
表TBL(c1 int, c2 int, c3 int);
有SQL語句 :SELECT A.c1, B.c3 FROM TBL A , TBL B WHERE A.c1 = B.c3 AND A.c2 = 4;
針對上面的SQL語句,執行過程為:一,讀取A,B表中的每一條元組;二,將A,B的各個元組作笛卡爾積;三,使用WHERE條件對串連的結果作過濾。
針對上述執行的三個階段,我們將SQL中的條件也分為三類:
A類,表的過濾條件,對基表讀取出來的元組進行過濾;
B類,表的串連條件,兩個表作串連,以它為串連條件;
C類,串連的過濾條件,串連完成後,對串連的結果按該條件過濾。
對上述SQL語句而言,它與下面的SQL語句等價:
SELECT A.c1, B.c3 FROM (
SELECT * FROM TBL WHERE A.c2 = 4
) A INNER JOIN TBL B ON (A.c1 = B.c3) WHERE true;
則將原SQL語句的WHERE中的兩個條件,一個下推到基表上作為表的過濾條件(A.c2 = 4),另一個下推到兩個表,作為它們的串連條件(A.c1 = B.c3)。而此時,串連的過濾條件為WHERE子句上的true,也即沒有串連的過濾條件。

在針對錶之間的串連為內串連時,WHERE條件上的各個以AND串連的運算式可以隨便地下推到基表作基表的過濾條件或者是串連上作串連條件,但當串連不為內串連時,該下推是不正確的, 參看下面的樣本:
表TBL_1 (C1 int, c2 int); 有元組(1, 1), (2, 2)
表TBL_2 (c1 int, c2 int); 有元組(1, 1), (null, null)
則此時
SELECT * FROM TBL_1 LEFT JOIN TBL_2 ON true WHRER TBL_1.c1 = TBL_2.c2;
它的查詢結果為:(1, 1, 1, 1)
而將WHERE條件下推到串連條件時,即SQL語句為
SELECT * FROM TBL_1 LEFT JOIN TBL_2 ON (TBL_1.c1 = TBL_2.c2) WHRER true;
則它的查詢結果為(1, 1, 1, 1), (2, 2, null, null)。
它們結果的不同是由於(TBL_1.c1 = TBL_2.c2)作為串連條件時,代表的意義是:對TBL_1中的一條元組,如果能與TBL_2中的任何一條元組使得(TBL_1.c1 = TBL_2.c2)值為TRUE,則將其串連,返回;如果沒有,則將TBL_1的元組輸出,右端補空。而當這個條件作為串連的過濾條件時,它會將(2, 2, null, null)過濾掉,因為它不滿足該串連的過濾條件。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.