18

我正在尝试在以下视图上创建索引:

SELECT     'Candidate' AS Source, CandidateID AS SourceId, LastName + ', ' + FirstName AS SourceName
FROM         dbo.Candidates
UNION
SELECT     'Resource' AS Source, ResourceID AS SourceId, LastName + ', ' + FirstName AS SourceName
FROM         dbo.Resources
UNION
SELECT     'Deal' AS Source, DealID AS SourceId, CONVERT(varchar, Number) + '-' + CONVERT(varchar, RevisionNumber) AS SourceName
FROM         dbo.Deals
UNION
SELECT     'Job Order' AS Source, JobOrderID AS SourceId, CustomerNumber AS SourceName
FROM         dbo.JobOrders

我收到以下错误:

Msg 1939, Level 16, State 1, Line 2
Cannot create index on view '_Source' because the view is not schema bound.

我将 WITH SCHEMABINDING 添加到 CREATE 中,现在出现以下错误:

Msg 10116, Level 16, State 1, Line 2
Cannot create index on view 'DEALMAKER.dbo._Source' because it contains one or more UNION, INTERSECT, or EXCEPT operators. Consider creating a separate indexed view for each query that is an input to the UNION, INTERSECT, or EXCEPT operators of the original view.

我的问题是:

我将如何在此视图上创建索引?创建单独的索引视图真的有效吗?

最后,我真的会看到任何可能加入此视图的查询的性能改进吗?

提前致谢!

4

2 回答 2

26

您不能在使用联合运算符的视图上创建索引。实在是没办法,抱歉!

我想你已经看到了,但是看看这个MSDN 页面。它给出了索引视图的要求并解释了它们是什么以及它们是如何工作的。

至于如果您可以索引视图是否会看到性能优势,这将完全取决于您的表的大小。我不希望对创建单独的索引视图有任何影响,因为我假设您的表已经被索引并且您没有在视图中执行任何连接或逻辑。

于 2009-04-15T14:02:03.950 回答
20

你为什么在世界上使用 UNION?

使用 SQL 中的文字,出现重复的可能性为零。再说一遍,为什么要使用 UNION?

UNION 强制发生不同的事情,并且比 DISTINCT 慢一点。

但既然你有这样的东西:

SELECT 'A'
UNION
SELECT 'B'
UNION
SELECT 'C'

你不可能有重复的。

将其更改为 UNION ALL,您的查询将执行得更快。

这是基本的 SQL - 编写一个经过良好调整的查询比创建视图索引更重要。从基础开始,了解 SQL,调整查询,然后担心花费空间和减慢 DML 以提高查询速度。

编辑:

查询中的文字可以防止表之间的重复。唯一剩下的可能性是表中的欺骗。由于列看起来像 PK,并且没有可能导致重复的连接,而且表看起来都像查找表,所以我说的是正确的。如果该假设不正确,那么您可能在没有 ALL 的情况下合法使用 UNION。然而,我发现 99% 的时间人们真的打算使用 ALL 并且我们公司的标准是仅使用 UNION 向 SQL 添加注释,因为它经常是一个错误。即联合——是的,我需要一个不同的列表。

于 2009-04-15T15:08:36.943 回答