1. 程式人生 > >SQL優化--使用內連線(inner join)代替外連線(left join,right join)

SQL優化--使用內連線(inner join)代替外連線(left join,right join)

避免 LEFT JOIN 和 NULL

       當然,有很多時候您需要執行 LEFT JOIN 和使用 NULL 值。但是,它們並不適用於所有情況。改變 SQL 查詢的構建方式可能會產生將一個花幾分鐘執行的報告縮短到只花幾秒鐘這樣的天壤之別的效果。有時,必須在查詢中調整資料的形態,使之適應應用程式所要求的顯示方式。雖然 TABLE 資料型別會減少大量佔用資源的情況,但在查詢中還有許多區域可以進行優化。SQL 的一個有價值的常用功能是 LEFT JOIN。它可以用於檢索第一個表中的所有行、第二個表中所有匹配的行、以及第二個表中與第一個表不匹配的所有行。例如,如果希望返回每個客戶及其定單,使用 LEFT JOIN 則可以顯示有定單和沒有定單的客戶。

此工具可能會被過度使用。LEFT JOIN 消耗的資源非常之多,因為它們包含與 NULL(不存在)資料匹配的資料。在某些情況下,這是不可避免的,但是代價可能非常高。LEFT JOIN 比 INNER JOIN 消耗資源更多,所以如果您可以重新編寫查詢以使得該查詢不使用任何 LEFT JOIN,則會得到非常可觀的回報(請參閱圖 1 中的圖)。


1查詢

      加快使用 LEFT JOIN 的查詢速度的一項技術涉及建立一個 TABLE 資料型別,插入第一個表(LEFT JOIN 左側的表)中的所有行,然後使用第二個表中的值更新 TABLE 資料型別。此技術是一個兩步的過程,但與標準的 LEFT JOIN 相比,可以節省大量時間。一個很好的規則是嘗試各種不同的技術並記錄每種技術所需的時間,直到獲得用於您的應用程式的執行效能最佳的查詢。

測試查詢的速度時,有必要多次執行此查詢,然後取一個平均值。因為查詢(或儲存過程)可能會儲存在 SQL Server 記憶體中的過程快取中,因此第一次嘗試耗費的時間好像稍長一些,而所有後續嘗試耗費的時間都較短。另外,執行您的查詢時,可能正在針對相同的表執行其他查詢。當其他查詢鎖定和解鎖這些表時,可能會導致您的查詢要排隊等待。例如,如果您進行查詢時某人正在更新此表中的資料,則在更新提交時您的查詢可能需要耗費更長時間來執行。

避免使用 LEFT JOIN 時速度降低的最簡單方法是儘可能多地圍繞它們設計資料庫。例如,假設某一產品可能具有類別也可能沒有類別。如果 Products 表儲存了其類別的 ID,而沒有用於某個特定產品的類別,則您可以在欄位中儲存 NULL 值。然後您必須執行 LEFT JOIN 來獲取所有產品及其類別。您可以建立一個值為“No Category”的類別,從而指定外來鍵關係不允許 NULL 值。通過執行上述操作,現在您就可以使用 INNER JOIN 檢索所有產品及其類別了。雖然這看起來好像是一個帶有多餘資料的變通方法,但可能是一個很有價值的技術,因為它可以消除 SQL 批處理語句中消耗資源較多的 LEFT JOIN。在資料庫中全部使用此概念可以為您節省大量的處理時間。請記住,對於您的使用者而言,即使幾秒鐘的時間也非常重要,因為當您有許多使用者正在訪問同一個聯機資料庫應用程式時,這幾秒鐘實際上的意義會非常重大。

相關推薦

SQL優化--使用連線(inner join)代替連線left join,right join)

避免 LEFT JOIN 和 NULL        當然,有很多時候您需要執行 LEFT JOIN 和使用 NULL 值。但是,它們並不適用於所有情況。改變 SQL 查詢的構建方式可能會產生將一個花幾分鐘執行的報告縮短到只花幾秒鐘這樣的天壤之別的效果。有時,必須在查詢中調

sql多表操作-連線inner join連線left/right (out) join和交叉連線

1 內連線、外連線和交叉連線的區別 內連線:匹配2個表中的相同欄位,沒有的不加入結果集。 外連線:匹配2個表中共有的欄位。分為3種: 左連線——以左邊的為基準,右表中沒有的(相同欄位值)為null; 右連線——以右邊的為基準,左表中沒有的為null;

SQL中的交叉連線(CROSS JOIN)、連線(INNER JOIN)、連線(OUTER JOIN)

1、交叉連線CROSS JOIN 如果不帶條件子句,交叉連線將會返回被連線的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積; select  *from 表名 cross join  表名  on  條件表示式  2、內連線 INNER JOIN 內連線僅返回那些滿足連線條件的資料行。在內連線中,

關於多表查詢sql常用的連線語句:左連線、右連線連線

1)內聯接:    內聯接使用比較運算子(使用像 =  或 <> 之類的比較運算子)根據每個表共有的列的值匹配兩個表中的行,根據這兩張表中相同列的條件,得出其      交集。例如:  

SQLINNERLEFTRIGHT JOIN的區別和用法詳解

相信很多人在剛開始使用資料庫的INNER JOIN、LEFT JOIN和RIGHT JOIN時,都不太能明確區分和正確使用這三種JOIN操作,本文通過一個簡單的例子通俗易懂的講解這三者的區別,希望對大家能帶來幫助。 首先,我們建立示例資料庫和表。同時也要明確一個概念:A INN

連線,左連線連線),右連線連線),全連線交叉連線

有兩個表A和表B。表A結構如下: Aid:int;標識種子,主鍵,自增ID Aname:varchar 資料情況,即用select * from A出來的記錄情況如下圖1所示:   圖1:A表資料 表B結構如下: Bid:int;標識

LINQ使用連線1、組連線 2、連線 3、左連線 4、交叉連線

首先呢,今天在資料庫中寫好了笛卡爾連線,後面要改寫成LINQ的方式。突然瞬間蒙了,寫多了JOIN卻忘了怎麼去寫交叉連線(笛卡爾連線)。 順便複習一下LINQ的連線操作: static public class SampleData { static

表的複雜查詢----多表查詢、兩表的條件連線連線連線)、左連線、右連線、子查詢、分頁查詢

基於兩個或兩個以上的表或檢視的查詢。例如:emp和dept是兩張表。(這兩張表的deptno是共同欄位)    ①通過什麼條件把兩張表關聯(如果不使用條件關聯將產生行數乘積的合集---笛卡爾集)例子:emp表字段包含:每行有自己的名字和id以及自己的上級的id,同時自己的上級

SQL中各種Join語句leftright、full、inner)的區別

iamlaosong文 實際工作中常常需要將多個表的查詢結果合成的一個查詢中,我一般採用join語句進行連線,用的最多的就是left join,這麼多join的差別是什麼呢?簡單的說就是最終結果以誰為

SQL優化案例-分割槽索引之無字首索引六)

無字首索引:分割槽索引不包含分割槽欄位就叫無字首索引,那麼什麼時候用無字首索引和字首索引呢? SQL文字如下,跨分割槽查詢,分割槽欄位post_date(為保證客戶隱私,已經將註釋和文字部分去掉): 跨30個分割槽執行了6分鐘。 SELECT /*+index(I IND_DATE_CO

SQL優化--使用 EXISTS 代替 IN 和 inner join來選擇正確的執行計劃

tool pos inner ner 使用 邏輯讀 rda jpg 分享 在使用Exists時,如果能正確使用,有時會提高查詢速度: 1,使用Exists代替inner join 2,使用Exists代替 in 1,

連線inner join)與連線(outer join)小結

mySQL包含兩種聯接,分別是內連線(inner join)和外連線(out join),但我們又同時聽說過左連線,交叉連線等術語,本文旨在總結這些術語之間的關係。 1. 內連線 首先說明內連線的一個重要性質:內連線查詢結果與表的順序無關 (當然順序可

Oracle 連線inner join)、連線outer join)、全連線full join

http://blog.itpub.net/30175262/viewspace-1472290/之前沒有用過 full outer join,第一次用,學習一下Student表Color表Oracle中的連線可分為,內連線(inner join)、外連線(outer joi

SQL語句的並集UNION,交集JOIN(連線連線),交叉連線(CROSS JOIN笛卡爾積),差集(NOT IN)

1.a. 並集UNIONSELECT column1, column2 FROM table1UNIONSELECT column1, column2 FROM table2b. 交集JOINSELECT * FROM table1 AS a JOIN table2 b ON

SQL Server中的連線(inner join)

目錄 零、碼仙勵志 不被嘲笑的夢想是沒有價值的。願你的夢想不只是空談的情懷,而是實幹的姿態 一、建庫和建表 create database scort use scort create table emp ( empno int primar

SQL 連線連線區別

資料庫的資料: 資料分級: 100 定義的是鎖,110 定義的是門鎖,111定義的是門鎖的種類例如光交門鎖。 那麼 門鎖的種類就是110~190  9 種,具體細分,鎖的種類就是總共:9*9=81種。夠用了。 這種型別的表,適合做自連線。 左外連結:連線2次。左側的資

SQL的左連線連線 連線連線

a表     id   name                      b表     id     &nb

Oracle的連線(left/right/full)和連線(inner)

外連線分為三種: 1. 左外連線,對應SQL關鍵字:LEFT (OUTER) JOIN 2. 右外連線,對應SQL關鍵字:RIGHT (OUTER) JOIN 3. 全外連線,對應SQL關鍵字:FULL (OUTER) JOIN 左右外連線都是以一張表為基表,在顯示基表所有記錄外

Join操作基本:連線、自然連線連線

Join操作基本分為3大類:外連線(細分為:左連線、右連線、全連線)、自然連線、內連線 Join操作的共性:第一步均為將所有參與操作的表進行了一個笛卡兒積,然後才依據各連線 條件進行記錄的篩選 SQL> select * from employees;

SQL server 使用 聯結(INNER JOIN) 聯結多個表 以及過濾條件 WHERE, AND使用區別)

INNER JOIN ……ON的語法格式: FROM (((表1 INNER JOIN 表2 ON 表1.欄位號=表2.欄位號) INNER JOIN 表3 ON 表1.欄位號=表3.欄位號) INNER JOIN 表4 ON Member.欄位號=表4.欄位號) INNER JOIN 表X ON