2009-06-01 62 views
3

我对我的表格(“用户”)使用视图(“UsersActive”)。该视图只有一个筛选器,它检查DateTime Users.DeletedOn是否为NULL;它基本上包含所有未被删除的用户。SQL:查看表 - 对View的查询是否仍然使用表索引?

如果我现在对视图执行Linq查询而不是表,他们仍然会使用表索引还是需要为视图创建特殊索引?在我的理解中查看是什么都没有,但一个预定义的查询,并应工作一样,如果我是这样直接查询:WHERE DeletedON = NULL

是我的假设

SELECT * FROM用户底层表的索引仍然会被正确使用?

+0

Yoyur假设是正确的:) – Arvo 2009-06-01 19:29:08

回答

5

大多数情况下,SQL Server查询优化器足够智能,可以使用基表上的索引。您可以通过查看查询计划来查看。

如果您拥有SQL Server的企业版,则还可以使用索引视图。

-1

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

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

+0

?不知道为什么我得到一个这样的downvote? – jfrobishow 2009-06-02 01:48:53

2

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

1

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

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

索引视图实现(并保持最新)索引。这对视图的用户可用,但仍可能不会使用。

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

0

最有可能你需要重写查询:

SELECT * FROM用户WHERE DeletedON IS NULL

DeletedON = NULL不会是真实的,即使DeletedON IS NULL