簡體   English   中英

MySQL-在LEFT OUTER JOIN上無休止地運行查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM