【问题标题】:Left Outer Join Query Extremely Slow - SQL Server左外连接查询极慢 - SQL Server
【发布时间】:2016-08-29 15:17:57
【问题描述】:

SQL Server 查询的大问题!

所以下面的查询在查询中使用了 JOIN 命令,但运行时间不少于 15-20 分钟!不知道如何更好地优化这段代码:(

关于如何解决此问题的任何想法?

SELECT dbo.DB_Timetrack.[JOB #], dbo.DB_Timetrack.[Last Name], dbo.DB_Timetrack.[First Name], dbo.DB_Timetrack.HOURS, dbo.DB_Timetrack.BEGDATE, dbo.DB_Timetrack.LOCATNID, 
                         dbo.DB_Timetrack.DESCR, dbo.DB_Timetrack.CODE, dbo.DB_Timetrack.TYPE, 
                         CASE WHEN dbo.DB_Job_status_open_and_closed.WS_Job_Number != '' THEN dbo.DB_Timetrack.Hours ELSE 0 END AS HoursWon, dbo.DB_Timetrack.NUMBERONLY, 
                         dbo.DB_Job_status_open_and_closed.WS_Job_Number_Only, dbo.DB_Job_status_open_and_closed.CREATDDT, DATEDIFF(Day, dbo.DB_Timetrack.BEGDATE, 
                         dbo.DB_Job_status_open_and_closed.CREATDDT) AS Date_Difference, DBCRM_MSCRM.dbo.DB_Opportunity_SalespersonID.new_GPSalespersonName, 
                         CASE WHEN DBCRM_MSCRM.dbo.DB_Opportunity_SalespersonID.new_GPSalesRepCode <> '' THEN DBCRM_MSCRM.dbo.DB_Opportunity_SalespersonID.new_GPSalesRepCode ELSE dbo.DB_Job_status_open_and_closed.Salesperson
                          COLLATE Latin1_General_CI_AI END AS SalespersonID

FROM            dbo.DB_Timetrack LEFT OUTER JOIN
                         DBCRM_MSCRM.dbo.DB_Opportunity_SalespersonID ON dbo.DB_Timetrack.NUMBERONLY COLLATE Latin1_General_CI_AI = DBCRM_MSCRM.dbo.DB_Opportunity_SalespersonID.Job_Num_Only LEFT OUTER JOIN
                         dbo.DB_Job_status_open_and_closed ON dbo.DB_Timetrack.NUMBERONLY = dbo.DB_Job_status_open_and_closed.WS_Job_Number_Only

WHERE        (dbo.DB_Timetrack.HOURS > 0) AND (dbo.DB_Timetrack.DESCR <> '') AND (dbo.DB_Timetrack.BEGDATE > CONVERT(DATETIME, '2013-01-01 00:00:00', 102))

任何建议将不胜感激!

【问题讨论】:

  • 15-20 分钟?这些表有多少行?
  • 要问一个显而易见的问题,您是否在连接列上设置了索引?
  • 您的代码看起来更像 SQL Server 而不是 MySQL。你确定你必须正确标记问题吗?
  • 400K 行。海量数据。的确,我愿意。尝试创建多个索引差异,但无济于事
  • @GordonLinoff 感谢您的收获。我已经更正了标记问题

标签: sql sql-server database performance join


【解决方案1】:

这基本上是您的查询:

SELECT . . .
FROM dbo.DB_Timetrack LEFT OUTER JOIN
     DBCRM_MSCRM.dbo.DB_Opportunity_SalespersonID
     ON dbo.DB_Timetrack.NUMBERONLY COLLATE Latin1_General_CI_AI = DBCRM_MSCRM.dbo.DB_Opportunity_SalespersonID.Job_Num_Only LEFT OUTER JOIN
     dbo.DB_Job_status_open_and_closed
     ON dbo.DB_Timetrack.NUMBERONLY = dbo.DB_Job_status_open_and_closed.WS_Job_Number_Only
WHERE (dbo.DB_Timetrack.HOURS > 0) AND
      (dbo.DB_Timetrack.DESCR <> '') AND
      (dbo.DB_Timetrack.BEGDATE > CONVERT(DATETIME, '2013-01-01 00:00:00', 102))

1.) 首先,排序规则可能会扼杀索引的任何使用。

2.) 您需要确保在 DB_Job_status_open_and_closed(WS_Job_Number_Only)DB_Opportunity_SalespersonID(Job_Num_Only) 上有索引。

3.) 您可能还会发现DB_Timetrack(BEGDATE, HOURS, DESCR, NumberOnly) 上的索引会有所帮助(如果您真的使用 SQL Server,最后三列可以只是 include)。

【讨论】:

  • 非常详细。试一试,看看性能是否可以提高,并会带着我的结果返回这里!再次感谢
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 2016-02-19
  • 1970-01-01
相关资源
最近更新 更多