我正在对我的表(“用户”)使用视图(“UsersActive”)。该视图只有一个过滤器,它检查DateTime Users.DeletedOn是否为NULL;它基本上包含所有未删除的用户。
如果我现在对视图而不是表执行Linq查询,它们仍然会使用表索引还是我需要为视图创建特殊索引?在我的理解中,View只不过是一个预定义的查询,应该像我直接查询它一样工作:
SELECT * FROM Users WHERE DeletedON = NULL
我的假设是基础表的索引仍然会被正确使用吗?
答案 0 :(得分:6)
大多数情况下,SQL Server查询优化器足够智能,可以使用基表上的索引。您可以通过查看查询计划来查看此信息。
如果您拥有SQL Server的企业版,您还可以使用索引视图。
答案 1 :(得分:2)
对于底层SQL语句,视图非常透明。这是一个很好的可靠设计假设。
答案 2 :(得分:1)
索引视图与非索引视图非常不同。
引擎可以有效地内联扩展视图,因此可以使用由优化器确定的任何表索引。
索引视图实现(并保持最新)索引。这可供视图的用户使用,但仍可能无法使用。
基于您的示例的附加说明 - 索引可能无法在NULL条件上有效地使用,因为它可能位于标记或代码列上。
答案 3 :(得分:0)
您很可能需要重写查询:
SELECT * FROM Users WHERE DeletedON IS NULL
即使DeletedON为空
,DeletedON = NULL也不会为真答案 4 :(得分:-1)
如果未编入索引的视图将使用定义它的查询每次重新生成。如果索引该查询中的表,则将使用表的索引。
您还可以索引视图,在这种情况下,数据集将提交到物理磁盘,您将拥有两组索引。