任何人都可以帮我这个。
我应该把索引放在哪里,因为它是一个视图?索引子查询(表)是否有助于优化它,或者我应该仅在视图上放置索引?
非常感谢。
vw_fact_test
上的INDEX?A1LE_Project
上的INDEX?代码:
ALTER VIEW [dbo].[vw_fact_test]
AS
SELECT
A.Column1
A.Column2,
A.Column3,
CASE
WHEN Column4 IS NULL OR Column4 = '' OR Column4 = 'NULL'
THEN 'unknown'
ELSE Column4
END AS Column4,
CASE
WHEN Column5 IS NULL OR Column5 = '' OR Column5 = 'NULL'
THEN 'unknown'
ELSE Column5
END AS Column5,
A.Column6,
dbo.M3Ofc_Lookups.Column7
FROM
(SELECT
Column1,
Column2,
Column3,
Column4,
Column5,
Column6,
FROM
dbo.A1LE_Project) AS A
INNER JOIN
dbo.M3Ofc_Lookups ON A.[Office Code] = dbo.M3Ofc_Lookups.[Office Code]
WHERE
(A.Column2 <> 0) OR
(A.Column3 <> 0) OR
(A.Column4 <> 0)
答案 0 :(得分:0)
首先,您可以简化select语句,这样可以更轻松地阅读和思考索引。您不需要子查询。
SELECT A.Column1, A.Column2, A.Column3,
CASE
WHEN Column4 IS NULL OR Column4 = '' THEN 'unknown'
ELSE Column4
END AS Column4,
CASE
WHEN Column5 IS NULL OR Column5 = '' THEN 'unknown'
ELSE Column5
END AS Column5,
A.Column6, B.Column7
FROM dbo.A1LE_Project AS A
INNER JOIN dbo.M3Ofc_Lookups AS B
ON A.[Office Code] = B.[Office Code]
WHERE (A.Column2 <> 0) OR (A.Column3 <> 0) OR (A.Column4 <> 0);
您需要考虑表的大小以及要提高性能的位置。您还需要检查执行计划。
如果表B是查找表,则它可能相当小。因此查询处理器可以以很少的成本进行表扫描。如果它是相当大的,使[Office Code]成为集群主键会有所帮助。或者可能在[Office Code]和Column7上添加索引。
表A中有多少条记录,列的类型和大小是什么?
如果表A具有大量记录,并且select语句将产生一小部分,则将索引放在Column2,Column3和Column4上可能会有所帮助。查询处理器将能够尽早快速选择所需的记录。您需要对此进行测试,并查看对执行计划的影响。
如果第1列到第6列很小,并且该表包含许多其他列,那么添加覆盖索引可能有所帮助。
在添加任何索引之前,您需要考虑数据库的更新方式以及对性能的影响。数据库是仅用于报告,还是也在更新?
在视图本身上添加索引可能会对更新性能产生严重影响。这几乎就像创建一个自动保持步骤的附加表。请参阅SQL Server联机丛书&gt;创建索引视图。 “在视图上创建的第一个索引必须是唯一的聚簇索引。在创建唯一聚簇索引之后,您可以创建其他非聚簇索引。在视图上创建唯一聚簇索引可提高查询性能,因为视图存储在数据库中以同样的方式存储具有聚集索引的表。“