SQL Server索引视图
我想在SQL Server中创建一个索引视图,我想知道如果我需要索引视图列。SQL Server索引视图
我这样问,因为视图是由已经有索引列的表组成的。
所以,如果TABLE1
已列FOO
已经索引作为一个非聚集索引,我必须为列FOO
添加一个索引来为SQL Server使用索引新创建的看法?
或者SQL Server知道在搜索视图时使用TABLE1中的索引吗?
的看法是这样的
CREATE VIEW [dbo].[v_eventActivity]
WITH SCHEMABINDING
AS
SELECT ea.id,
e.eventID,
e.name,
ea.userID,
ea.activityTypeID,
ea.timeStamp,
ea.visitDuration
FROM dbo.table1 e,
dbo.table2 ea
WHERE e.eventID = ea.eventID
我要在所有这些列的搜索在一起。
如前所述,table1和table2都已经有了索引的列。
SQL Server中的索引视图几乎没有区别,在别处称为物化视图。如果您的视图具有使用在基表上定义的索引的基础查询,则视图上的选择也将使用该索引,这不是索引视图所关注的内容。
如果您经常使用视图并且性能很重要,您可以选择放弃更多的磁盘空间(和cpu时间)并在视图上创建唯一的聚集索引,从而实现对视图的更快查询,因为SQL Server不必返回到基表或表,并从视图的索引获取所需的所有内容。
看一看here。
如果它已经是索引视图,则不能在视图上添加唯一的聚簇索引。这就是索引视图的定义(除非唯一的聚集索引已经存在,否则不能在视图上创建非唯一索引或非聚集索引)。 – 2012-02-08 18:55:11
@AaronBertrand:视图必须没有事先索引,我不暗示它有!表格可能有索引。 – Mithrandir 2012-02-08 18:57:50
我读它的方式,你的描述应该像你应该添加一个独特的聚集索引到索引视图。 – 2012-02-08 19:00:17
除非提供NOEXPAND
提示(文档here),否则视图将简单地使用表索引。
可以按如下自己测试:
CREATE TABLE [test].[TestTable] (
id INT IDENTITY PRIMARY KEY,
foo INT
)
CREATE NONCLUSTERED INDEX ixFoo
ON [test].[TestTable] (foo)
CREATE VIEW [test].[TestTableView] WITH SCHEMABINDING
AS
SELECT
t.id,
t.foo
FROM [test].[TestTable] t
GO
CREATE UNIQUE CLUSTERED INDEX ixFooId
ON [test].[TestTableView] (id)
CREATE NONCLUSTERED INDEX ixFooView
ON [test].[TestTableView] (foo)
下面是三个单独的查询执行计划:
SELECT
t.[id],
t.[foo]
FROM [test].[TestTable] t
ORDER BY t.[foo]
SELECT
v.[id],
v.[foo]
FROM [test].[TestTableView] v
ORDER BY v.[foo]
SELECT
v.[id],
v.[foo]
FROM [test].[TestTableView] v WITH (NOEXPAND)
ORDER BY v.[foo]
我想我知道这个问题的答案,但在写它确定,其实我不知道。好Q!知道的最好方法可能是尝试一下并看看。你也应该指定什么SS版本。 – JNK 2012-02-08 18:42:12
通常,索引视图不表示整个表格,因此在特定列上表示索引通常没有意义。你有没有创建视图?你可以分享表格结构,你正在谈论的索引以及视图的定义(包括它的索引)吗? – 2012-02-08 18:44:27
我确实尝试过。查询执行计划表示它确实使用原始表的索引。但我只是想确定一下。 – KDV 2012-02-08 18:44:48