[英]MySQL - endless running query on LEFT OUTER JOIN
在過去的兩天里,我一直在處理一個查詢。 我試圖以多種方式剖析它的各個部分,並且發現查詢只有在我添加了LEFT OUTER JOIN時才會中斷。 我已經嘗試了許多不同的方法,甚至將我的參考表之一加入了我想在我的實際語句中使用的某些表,但是到目前為止沒有用。
(注意;出於可讀性考慮,列選擇器一直保持為“ *”,通常這里有很多行。當我使用*選擇器進行測試時,行為是相同的。)
我的完整查詢:
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-Clauses,添加“ AS”關鍵字(在MSSQL中也是如此),嘗試在一個表上進行單個左外部聯接和單個內部聯接。
編輯:可能值得注意的是,這將是我第一次使用MySQL而不是MSSQL / T-SQL,我當然試圖查找其他示例,但這到目前為止對我沒有幫助。
查看查詢,擁有索引是一回事,擁有針對您的要求進行更好優化的索引是另一回事。 您的表上是否有復合索引? 我假設您在基於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 ...
出於某種奇怪的原因,當我嘗試再次運行相同的查詢而沒有提及“ AS”並且在4.5秒后僅一個左外連接(我讓我昨晚執行的那個仍然將它們加入)時,查詢似乎可以運行並獲取在10分鍾后完成...一旦我添加了第二個左外部連接,提取時間就將近16分鍾...可能與實際上返回的大量數據有關...
這使我認為問題在於語法(不再存在,或者也許從未如此?),畢竟是性能問題。 我熟悉使用SQL Server Management Studio進行性能調試,但出於相同的目的還沒有使用MySQL Workbench ...似乎這些工具僅受MySQL 5.6.6+支持,因為我的生產和測試服務器都運行MySQL 5.5.44(這些系統在Debian Jessie上運行)我將不得不想出一種方法來執行此操作……很可能最終會在今天結束時為此啟動一個額外的test-vm。
我對性能如何對我們已經/已經在MS-SQL上的實現產生如此大的影響感到困惑...將不得不對此進行深入研究。 如果路過的任何人碰巧有任何線索,將不勝感激。
編輯; 我由衷的歉意,似乎我在重新創建表時只是犯了一些錯誤,而我沒有為兩個表建立正確的索引...我感到很愚蠢。 謝謝您的幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.