【问题标题】:Optimising a join SQL Server优化连接 SQL Server
【发布时间】:2018-03-24 14:47:55
【问题描述】:

在优化查询方面我非常缺乏经验,因此非常感谢任何帮助。

我目前有一个 3 路连接,执行需要 + 10 分钟。我目前正在尝试对此进行测试,因此必须等待那么长时间并不理想。有什么办法可以让它更快吗?

当前查询:

SELECT  
DISTINCT
S.[No],
S.[Date],
S.[No],
L.[No],
C.[Name],
C.[E-Mail],
C.[Order]
FROM [Customer] C
JOIN [Line] L
ON C.[No] = L.[No] 
JOIN [Sale] S 
ON S.[No] = L.[No] 
WHERE S.[Date] >= '2017-04-01'
AND L.[Type] = '2'
AND C.[Type] = '2'

据我所知,所有列都没有索引。哪些列最适合添加索引?

表格行:

客户:80,000 行

行:550,000 行

销售:1,300,000 行

我最初已将其更改为先加入较小的表,但似乎没有太大区别。

谢谢

【问题讨论】:

  • As far as im aware none of the columns have indexes. 为什么?
  • @Siyual 这就是别人设置的方式
  • 那么修复它。缺乏索引是很成问题的。这些表上有主键吗?
  • 嗯,显而易见的解决方案是查看查询计划,并为表添加索引。特别是在Sale.Date 列上。
  • 我怀疑您的查询在逻辑上存在缺陷。这就是为什么您应该为所涉及的表发布 DDL。我不知道“Line”代表什么,但客户与销售相关联听起来很合适。在 Line.No 上同时加入客户和销售似乎非常可疑。

标签: sql sql-server join optimization


【解决方案1】:

这是您的查询:

SELECT DISTINCT S.[No], S.[Date], S.[No], L.[No],
       C.[Name], C.[E-Mail], C.[Order]
FROM [Customer] C JOIN
     [Line] L
     ON C.[No] = L.[No] JOIN
     [Sale] S 
     ON S.[No] = L.[No] 
WHERE S.[Date] >= '2017-04-01' AND L.[Type] = '1' AND C.[Type] = '1';

以下是建议:

  1. 删除SELECT DISTINCT,除非你真的需要它。这会增加不必要的开销。
  2. 如果Type 是数字,则将'1' 更改为1。我猜对了。
  3. 为所有连接键添加索引。
  4. 检查连接。 . .如果所有表都使用同一列,我会感到惊讶。
  5. 您可能希望在WHERE 子句中的列上建立索引。但是,我怀疑连接键是真正的性能问题。

在正常情况下,对这样大小的三个表的查询应该不会花费 10 分钟,这就是我怀疑连接键错误的原因。

【讨论】:

  • 添加索引会导致什么问题?就数据库的其余部分而言?
  • @RyanGadsdon 。 . .索引在磁盘上占用更多空间并且会占用内存。它们还会稍微减慢插入、更新和删除的速度(通常是一点点)。
猜你喜欢
  • 2018-12-27
  • 2013-09-01
  • 1970-01-01
  • 2018-10-30
  • 2012-06-28
  • 2016-02-18
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多