【发布时间】:2015-04-23 22:27:49
【问题描述】:
我有一个需要 4 分钟才能运行的旧视图,我被要求加快速度。 FROM 看起来像这样:
FROM TableA
CROSS JOIN ViewA
INNER JOIN TableB on ViewA.Name = TableB.Name
AND TableA.Code = TableB.Code
AND TableA.Location = TableB.Location
WHERE (DATEDIFF(m, ViewA.SubmitDate, GETDATE()) = 1) -- Only pull last months rows
表 A 大约有 99k 行,ViewA 大约有 2000 行,TableB 大约有 101K 行。我认为问题出在 INNER JOIN 因为我删除它,查询需要 1 秒。
我的第一个想法是看看是否可以通过将整个内容分解为 CTE 来减少 ViewA 中的行数,但这会产生零影响。我想我需要索引 TableB,因为它只是在连接中使用的一堆 varchars。我现在将它更改为临时表,以便我可以索引它。我无法更改基础表和视图。索引临时表是一个好方法,还是有更好的解决方案。
编辑以添加有关现有索引的信息。现在唯一带有索引的是 TableA.Id,它是 PK 和聚集索引。 TableB 有一个 Id 字段,但它不是 PK。 ViewA 未编入索引。
再次编辑以更正某些结构。 SubmitDate 在视图中,而不是表中。
这是一个非常基本的结构:
CREATE TABLE TableA
(
Id int NOT NULL PRIMARY KEY,
Section varchar(20) NULL,
Code varchar(20) NULL
)
CREATE TABLE TableB
(
Id int NOT NULL PRIMARY KEY,
Name varchar(20) NULL,
Code varchar(20) NULL,
Section varchar(20) NULL
)
CREATE TABLE TableC
(
Id int NOT NULL PRIMARY KEY,
Name varchar(20) NULL,
SubmitDate DateTime NOT NULL
)
CREATE TABLE TableD
(
Id int NOT NULL PRIMARY KEY,
Section varchar(20) NULL
)
CREATE VIEW ViewA
AS
SELECT c.Section, d.Name, c.SubmitDate
FROM TableC c
JOIN TableD d ON a.Id = b.Id
【问题讨论】:
-
为什么是
CROSS JOIN?TableA.SubmitDate上面有索引吗?即使没有,stop using non-sargable arguments against it(也可以是stop using shorthand),并尝试 >= 上月初和 -
查看关于键和索引的编辑。
标签: sql-server indexing view database-performance