关闭

避免LEFT JOIN 和 NULL

1672人阅读 评论(0) 收藏 举报
避免LEFT JOIN 和 NULL


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

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

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

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

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

0
0

  相关文章推荐
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:21673次
    • 积分:293
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:10篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论