sql同時查詢兩個資料表 - sql連接兩個資料庫




sql查詢連接多個表-太慢(8個表) (6)

我正在嘗試將8個表連接成一個以創建其他應用程序使用的索引,我的查詢就像:(我的mysql技能非常業餘)

SELECT t1_id, t2_name, t3_name, t4_name, t5_name, 
       t6_name, t7_name, t8_name, t9_name 
FROM t1 
  LEFT JOIN t2 ON (t1_id = t2_id) 
  LEFT JOIN t3 ON (t3_id = t1_id) 
  LEFT JOIN t4 ON (t4_id = t1_id)
  LEFT JOIN t5 ON (t5_id = t1_id)
  LEFT JOIN t6 ON (t6_id = t1_id) 
  LEFT JOIN t7 ON (t7_id = t1_id)
  LEFT JOIN t8 ON (t8_id = t1_id)
  LEFT JOIN t9 ON (t9_id = t1_id)

當我執行它時,我甚至無法看到查詢結果,任何加速它的方法? :)讚賞任何種類的幫助,但最好只有一個查詢(外部應用程序規則)

提前致謝


如果您可以發布查詢的解釋計劃,那會有所幫助。

但是,首先,您在連接中使用的所有字段都有索引? 類似於CREATE INDEX ix_t2_id on t2 (t2_id, t2_name);

而不是連接,你可以做類似的事情

SELECT t1_id, 
    (select t2_name from t2 where t1_id = t2_id), 
    (select t3_name from t3 where t1_id = t3_id), 
    (select t4_name from t4 where t1_id = t4_id), 
    (select t5_name from t5 where t1_id = t5_id), 
    (select t6_name from t6 where t1_id = t6_id), 
    (select t7_name from t7 where t1_id = t7_id), 
    (select t8_name from t8 where t1_id = t8_id), 
    (select t9_name from t9 where t1_id = t9_id) 
FROM t1 

但是,有了一個好的查詢規劃器,它應該與連接不同。


如果您需要t1的所有行,並且您在其他表的主鍵(我猜它也是聚簇索引)上保持連接,則無法提高查詢的速度。

要提高性能,您需要減少結果集或執行令人討厭的技巧(例如,製作數據的非規範化副本)。


我有一個類似的問題,幾個查找表連接到一個所有id字段索引的大表。 為了監視聯接對查詢時間執行的影響,我多次運行我的查詢(限制為前100行),每次都向另一個表添加一個Join。 加入12個表後,查詢執行時間沒有顯著變化。 當我加入第13個表時,執行時間跳到1秒; 第14桌4秒,第15桌20秒,第16秒90秒。

Keijro建議使用相關子查詢而不是連接,例如

SELECT t1_id, 
        (select t2_name from t2 where t1_id = t2_id), 
        (select t3_name from t3 where t1_id = t3_id), 
        (select t4_name from t4 where t1_id = t4_id), 
        (select t5_name from t5 where t1_id = t5_id), 
        (select t6_name from t6 where t1_id = t6_id), 
        (select t7_name from t7 where t1_id = t7_id), 
        (select t8_name from t8 where t1_id = t8_id), 
        (select t9_name from t9 where t1_id = t9_id)  FROM t1

顯著提高查詢性能。 事實上,子查詢似乎沒有延長執行查詢的時間(查詢幾乎是不穩定的)。

我有點驚訝,因為我認為相關子查詢比連接更糟糕。


根據您的SQL Server版本,只需將查詢放入存儲過程可能會產生很大的不同。 在您首先嘗試其他優化之後嘗試這一點。(是的,我知道有緩存的執行計劃和其他內部服務器優化,但在我的實際實際經驗中,存儲過程可以更快地執行。)


根據表中的數據量,您可能需要在要連接的列上放置索引。 查詢速度通常很慢,因為缺少正確的索引。

也:

LEFT JOIN比INNER JOIN慢(雖然這取決於你正在做的事情) - 你能用內連接完成你想要的東西嗎?


正如我所看到的,t1表是與所有表連接的表,而不是將它們放在具有如此多連接的單個查詢中,您可以嘗試使用這樣的不同查詢的聯合。

SELECT  t1_id, t2_name 
FROM    t1 LEFT JOIN t2 ON (t1_id = t2_id)
union 
SELECT  t1_id, t3_name 
FROM    t1 LEFT JOIN t3 ON (t1_id = t3_id)

但是,在這種情況下,您將獲得的結果將不會有8列,而只有1列。 不確定這是否是您的選擇。

還有一件事,你必須在你實現的任何解決方案中 - 在所有表上創建適當的索引。 索引列的最佳實踐是在最常用於連接或where子句的列上創建它。





join