在过去的两天里,我一直在搞乱一个查询。 我试图以无数种方式剖析它的各个部分,并且发现只有当我添加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,我当然试图查找其他示例,但这对我没有帮助到目前为止。
答案 0 :(得分:1)
查看您的查询,拥有索引是一回事,拥有针对您要求的内容进行更优化的索引是另一回事。你的桌子上有复合索引吗?我假设您的主键上有基于JOIN组件的索引。但特别是三个我会索引索引的多个字段。
table index
SO_SalesOrder ( customer, orderstatus, salesordernr )
SO_LEG ( salesorder, beginactivity, endactivity, cargo )
SO_Activity ( activitynr, date )
看来你" SO_Activity"表有"活动"作为主键。
MySQL下的另一个选项。如果这些索引没有帮助,那么我会尝试添加关键字" STRAIGHT_JOIN"告诉MySQL加入确切的顺序,因为你已经列出了表,因为其他人都受到你想要的主要销售订单的影响,这是针对特定客户的...这可能是数据库方案中的一小部分内容。
SELECT STRAIGHT_JOIN * from ...
答案 1 :(得分:0)
由于某些奇怪的原因,当我尝试再次运行相同的查询时没有' AS'提到它们并且只有一个Left Outer Join(我让它们执行的过夜仍然让它们进入)4.5秒后查询似乎已经完成并且10分钟后获取完成...一旦我添加了第二个左外连接提取时间上升到将近16分钟...可能只是与实际返回的大量数据有关...
这让我认为问题在于(不再,或者可能永远不会真的是?)语法,毕竟是性能问题。我熟悉使用SQL Server Management Studio进行性能调试但是还没有将MySQL Workbench用于同样的目的......似乎只有MySQL 5.6.6+支持这些工具,因为我的生产都是如此和testserver一起运行MySQL 5.5.44(这些系统运行在Debian Jessie上)我必须找到一种方法来实现这个目标...最终可能会在今天结束时为此启动一个额外的测试vm ..
我对于性能如何阻止我们对MS-SQL的实施有很大的影响感到困惑......将不得不深入研究这个问题。 如果路过的人碰巧有任何线索,那将非常感激。
编辑;我真诚地道歉,似乎我在重新制作桌子时只是犯了一些错误而且我没有为两张桌子制作正确的索引......我觉得这很愚蠢。 谢谢你的帮助!