使用UNION运算符在SQL视图上创建索引?它真的会提高性能吗?

mat*_*uma 15 sql database sql-server views

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

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
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Msg 1939, Level 16, State 1, Line 2
Cannot create index on view '_Source' because the view is not schema bound.
Run Code Online (Sandbox Code Playgroud)

我将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.
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

最后,我是否真的会看到可能加入此视图的任何查询的性能提升?

提前致谢!

Ada*_*son 21

您无法在使用union运算符的视图上创建索引.真的没办法,对不起!

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

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


小智 18

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

使用SQL中的文字,您将有零重复的机会.再说一次,为什么要使用UNION?

UNION强制发生明显的变化,并且比DISTINCT慢一点.

但是因为你有一些看起来像这样的东西:

SELECT 'A'
UNION
SELECT 'B'
UNION
SELECT 'C'
Run Code Online (Sandbox Code Playgroud)

你不可能有重复的东西.

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

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

编辑:

查询中的文字可防止表之间的欺骗.唯一剩下的可能性是桌子内的欺骗.由于列看起来像PK,并且没有可能导致重复的连接,因为表格看起来都像查找表,我说的是正确的.如果这个假设不正确,那么你可能合法地使用没有ALL的UNION.但是我发现99%的人真的打算使用ALL,而且我们公司的标准是只用UNION为SQL添加注释,因为它经常是一个错误.即UNION - 是的,我需要一个独特的清单.

  • 你在这方面有点OTL。他没有使用 Select 'A',他使用 Select 'A', othercols from Table 所以他将在结果中获得与表中行一样多的行。我会说重复的可能性很大 (2认同)
  • 虽然你是对的,但union vs union并没有解决"索引视图"问题.您不能在包含Union All的视图上创建索引,尽管您可能没有,因为union all具有更好的性能. (2认同)