2015-10-06 44 views
0

過去兩天我一直在搞單個查詢。 我試圖解剖它的各個方面的個別部分,並發現查詢只有當我添加在左外部聯接中斷。 我試過很多不同的方法,甚至有我的參考表加入到我想在我的實際聲明中使用的一些表中,但迄今無濟於事。MySQL - 無盡的查詢左外部聯接

(注;列選擇一直保持在「*」的可讀性,有一噸的行這裏通常的行爲是一樣的,當我與*選擇測試。)

我的完整的查詢:

SELECT * 
     FROM SO_SalesOrder so 
     INNER JOIN SO_Leg as l ON l.SalesOrder = so.SalesOrdernr 
     INNER JOIN SO_Cargo cg ON cg.Cargonr = l.Cargo 
     INNER JOIN SO_Activity ea ON ea.Activitynr = l.EndActivity 
     INNER JOIN SO_Activity ba ON ba.Activitynr = l.BeginActivity 
     LEFT OUTER JOIN RP_TripActivity eta ON eta.Activity = l.EndActivity 
     LEFT OUTER JOIN Product p ON p.Productnr = cg.Product 
     WHERE ba.Date BETWEEN '2015-10-01 00:00:00' AND '2015-10-07 23:59:59' 
     AND OrderStatus != 2 
     AND so.Customer = 95; 

此數據庫已從MS-SQL服務器傳輸,因此我正在重寫查詢以適應此更改。 舊查詢(仍然)的作品,並用於如下:

SELECT * 
    FROM dbo.SO_SalesOrder as so 
    INNER JOIN dbo.SO_Leg as l ON l.SalesOrder = so.SalesOrdernr 
    INNER JOIN dbo.SO_Cargo AS cg ON cg.Cargonr = l.Cargo 
    INNER JOIN dbo.SO_Activity AS ea ON ea.Activitynr = l.EndActivity 
    INNER JOIN dbo.SO_Activity AS ba ON ba.Activitynr = l.BeginActivity 
    LEFT OUTER JOIN dbo.RP_TripActivity AS eta ON eta.Activity = l.EndActivity 
    LEFT OUTER JOIN dbo.RP_Trip AS et ON et.Tripnr = eta.Trip 
    LEFT OUTER JOIN dbo.RP_ResourceCombination AS erc ON erc.ResourceCombinationnr = eta.ResourceCombination 
    LEFT OUTER JOIN dbo.RP_Resource AS er1 ON er1.Resourcenr = erc.Truck 
    LEFT OUTER JOIN dbo.RP_ResourceCompany AS erc1 ON erc1.Resource = er1.Resourcenr AND erc1.Company = et.Company 
    LEFT OUTER JOIN dbo.VM_Vehicle AS ev1 ON ev1.Vehiclenr = er1.Vehicle 
    LEFT OUTER JOIN dbo.RP_Resource AS er3 ON er3.Resourcenr = erc.Driver 
    LEFT OUTER JOIN dbo.HR_Employee AS eemp3 ON eemp3.Employeenr = er3.Employee 
    LEFT OUTER JOIN dbo.Product AS p ON p.Productnr = cg.Product 
    WHERE ba.Date BETWEEN '2015-10-01 00:00:00' 
    AND '2015-10-07 23:59:59' 
    AND OrderStatus != 2 
    AND so.Customer = 95; 

會有人也許有任何指針作爲的地方,我可能會搞砸了?

我試過的東西: 刪除WHERE子句,添加「AS」關鍵字(也在MSSQL中完成),試圖在一個表上嘗試一個左外連接和一個內連接。

編輯:可能值得注意的是,這將是我第一次使用MySQL而不是MSSQL/T-SQL,我當然試圖查找其他示例,但迄今爲止這並沒有幫助我。

+1

是否已經在mysql上創建了sql-server中存在的索引?我不知道sql-server,但是mysql只能爲每個查詢使用一個索引,所以即使你創建了相同的索引,它們可能仍然不適合你。 – e4c5

+0

顯然'MySQL'可以爲每個查詢使用多個索引。來源:http://stackoverflow.com/questions/12222630/can-mysql-use-multiple-indexes-for-a-single-query –

+0

如果你有權訪問SQL Server Management Studio,你可以使用查詢優化工具創建應該有助於查詢執行時間的索引和統計信息。 – HashPsi

回答

1

看看你的查詢,有索引是一回事,索引是針對你要求的更好的優化是另一回事。你的桌子上有複合索引嗎?我假設你有基於JOIN組件的主鍵上的索引。但是,我特別要指出三個索引的多個字段。

table   index 
SO_SalesOrder (customer, orderstatus, salesordernr) 
SO_LEG   (salesorder, beginactivity, endactivity, cargo) 
SO_Activity  (activitynr, date) 

看起來你「SO_Activity」表中有「Activity」作爲主鍵。

MySQL下的一個附加選項。如果這些索引不起作用,那麼我會嘗試添加關鍵字「STRAIGHT_JOIN」,告訴MySQL按照您列出的表格的順序加入,因爲其他人都受您希望的主要銷售訂單的支配特定的客戶......這可能是數據庫內容方案中的一個小集合。

SELECT STRAIGHT_JOIN * from ... 
+0

感謝您的輸入!通過一個複合索引,你意味着一個單一的索引,目標是我假設的多個列? 迄今爲止,我已經指定了大多數具有獨立列的索引,除了BeginActivity和EndActivity這兩列,它們與UNIQUE觸發器(因爲活動編號是唯一的)存儲在同一個索引中。 我剛剛沒有想過在SO_Activity上包含日期列,謝謝你的提醒:) 並澄清; 我是否正確理解您的回覆,在我當前的查詢中,表格不一定按照我列出的順序加入,但是此順序可能會切換? – Annihlator

+0

@Annihlator,更正多個列的單個索引。正確加入訂單。有時候引擎可以解釋並且有時候會做出不太理想的加入。遇到針對政府合同的查詢/授予超過1,500萬條記錄的數據和約20個查找表以獲取密鑰的詳細描述。 20小時後墜毀。增加了STRAIGHT_JOIN,它在不到2小時的時間內工作(考慮到數據量被拉大,時機很好)。 – DRapp

+0

感謝提示,我總是簡單地假定表格通常是按照它的腳本順序連接的。我已經改變了一些指數來複合一些指數,並且在某些情況下,我已經添加了一個額外的複合指數。查詢執行時間從我剛剛添加缺失索引時的1.1秒,到更改爲複合索引後的0.26秒,降低到當刪除的奇異索引添加回表中已替換爲複合索引的表時的0.16秒時。主要改進! – Annihlator

0

由於某些奇怪的原因,當我試圖在沒有'AS'的情況下再次運行同樣的查詢時,4.5秒之後只有一個左外部聯接(我讓過夜執行仍然有一個) 10分鐘後完成抓取完成...一旦我添加了第二個左外部連接,抓取時間增加了近16分鐘...可能只是與大量數據實際返回有關。

這使得我認爲問題在於語法上的問題(不再是,或者可能從來沒有真正?),畢竟是性能問題。我熟悉使用SQL Server Management Studio進行性能調試,但並未將MySQL Workbench用於同一目的......似乎這些工具僅支持MySQL 5.6.6+,因爲我的生產環境和測試服務器都運行MySQL 5.5.44(這些系統在Debian Jessie上運行)我必須找出一種方法來做到這一點...可能最終會在今天結束時爲此啓動一個額外的測試-vm ..

我對於性能如何阻礙我們對MS-SQL的執行情況感到困惑......我們必須深入研究這一點。 如果任何路過的人碰巧有任何潛在客戶,那會非常感激。

編輯;我誠摯的道歉,好像我只是在重新創建我的表格時犯了一些錯誤,而且我沒有爲兩個表格創建合適的索引......我感到非常愚蠢。 感謝您的幫助!