使用 JOIN 查詢而不是手動呼叫兩個查詢(同時)并在代碼中加入它們通常更有效嗎?
例如:我有兩個表customer和address.
選項1: SELECT * FROM customer c LEFT JOIN address a ON c.id=a.customer WHERE c.id=123
選項2:SELECT * FROM customer WHERE c.id=123然后SELECT * FROM address WHERE customer=123在代碼中結合這兩者
- 這兩種方法中的一種總是比另一種更好嗎?
- 比較這些的最佳方法是什么?
uj5u.com熱心網友回復:
DBMS 旨在快速獲取您需要的資料。它可以在一個查詢中輕松處理多個表,并且仍然可以相當快地生成結果。您自己的代碼不太可能比 DBMS 更快地組合表(但它仍然是可能的)。
但是,您的示例非常簡單。由于這僅涉及一位客戶,因此從客戶表中檢索一行,而從地址表中僅檢索幾行。沒有多少加入那里。您已經準備好使用資料了。
但是,即使有這些查詢,也有一點:當從資料庫查詢資料時,會發生對話。您的應用程式將 SQL 字串發送到 DBMS。DBMS 決議字串,檢查其有效性,創建訪問計劃,然后告訴您的應用查詢將回傳哪些列(名稱和型別)。您的應用程式告訴 DBMS“好的,將資料發送給我”,然后 DBMS 發送第一個資料塊。對于兩次查詢,此對話(可能通過某個網路)發生兩次。這稱為往返,這是我們想要減少以獲得良好性能的東西。除了查詢字串的決議和執行計劃的構建之外,DBMS 中也需要一點時間,所以一次總比兩次好。
當涉及到更復雜的查詢時,DBMS 將嘗試找到最佳執行計劃(并且通常非常擅長)。它應該順序讀取表還是通過索引查找一些行?它是否應該遍歷一個表的行并為每一行找到另一個表中的匹配項以連接這些表?還是應該先對兩個表進行排序,然后回圈遍歷兩個排序串列,然后使用控制中斷演算法?或者它應該創建存盤桶并加入哈希表?DBMS 通常有可用的索引來幫助查找資料,有時使用它們是個好主意,有時則不。DBMS 甚至可能對您的資料進行統計,了解每個客戶的最高地址數和平均地址數。所有這些都用于以最佳方式查詢您的資料。
當然,您通常也知道您的資料。所以你也可以決定在適當的時候使用一些散列機制、二進制搜索等。也許一個查詢的一種技術和下一個查詢的另一種技術。但這可能需要大量的技巧和大量的作業,最終可能仍然會更慢。
但是,當然,您的辦公桌上可能有一臺超快的計算機,而資料庫服務器是您從祖父那里得到的一臺舊機器。那么這可能是一個好主意,只是檢索原始資料并在您的 PC 上進行處理。不過,根據經驗:讓 DBMS 為您做這件事。它幾乎總是更快的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/349955.html
