4

我正在对我的表(“用户”)使用视图(“用户活动”)。该视图只有一个过滤器,它检查 DateTime Users.DeletedOn 是否为 NULL;它基本上包含所有未删除的用户。

如果我现在对视图而不是表执行 Linq 查询,它们还会使用表索引还是我需要为视图创建特殊索引?在我的理解中,视图只不过是一个预定义的查询,应该像我直接查询它一样工作:

SELECT * FROM Users WHERE DeletedON = NULL

我假设基础表的索引仍将被使用是否正确?

4

5 回答 5

6

大多数时候,SQL Server 查询优化器足够聪明,可以使用基表上的索引。您可以通过查看查询计划来了解这一点。

如果你有企业版的 SQL Server,你也可以使用索引视图。

于 2009-06-01T19:29:08.647 回答
2

视图对底层 SQL 语句是完全透明的。这是一个很好的可靠设计假设。

于 2009-06-01T19:31:40.780 回答
1

索引视图与非索引视图非常不同。

引擎可以有效地内联扩展视图,因此可以使用由优化器确定的任何表索引。

索引视图具体化(并保持最新)索引。这对视图的用户可用,但仍可能不被使用。

基于您的示例的附加说明 - 索引可能不会像在标志或代码列上那样有效地用于 NULL 标准。

于 2009-06-01T19:42:51.833 回答
0

您很可能需要重写查询:

SELECT * FROM Users WHERE DeletedON IS NULL

即使 DeletedON IS NULL,DeletedON = NULL 也不会为真

于 2009-06-01T21:39:37.993 回答
-1

如果未编入索引,则每次使用定义它的查询都会重新生成视图。如果该查询中的表已编入索引,则将使用该表的索引。

您还可以索引视图,在这种情况下,数据集将提交到物理磁盘,并且您将拥有两组索引。

于 2009-06-01T19:30:35.773 回答