SQL:针对表的视图 - 针对视图的查询是不是仍在使用表索引?
Posted
技术标签:
【中文标题】SQL:针对表的视图 - 针对视图的查询是不是仍在使用表索引?【英文标题】:SQL: View against Table - are queries against the View still using Table Indexes?SQL:针对表的视图 - 针对视图的查询是否仍在使用表索引? 【发布时间】:2009-06-01 19:23:45 【问题描述】:我正在对我的表(“用户”)使用视图(“用户活动”)。该视图只有一个过滤器,它检查 DateTime Users.DeletedOn 是否为 NULL;它基本上包含了所有未被删除的用户。
如果我现在对视图而不是表执行 Linq 查询,它们是否仍会使用表索引,或者我是否需要为视图创建特殊索引?在我的理解中,视图只不过是一个预定义的查询,应该像我直接查询它一样工作:
SELECT * FROM Users WHERE DeletedON = NULL
我对基础表的索引仍将使用的假设是否正确?
【问题讨论】:
你的假设是正确的 :) 【参考方案1】:大多数时候,SQL Server 查询优化器足够聪明,可以使用基表上的索引。您可以通过查看查询计划来了解这一点。
如果您有企业版的 SQL Server,您也可以使用索引视图。
【讨论】:
【参考方案2】:视图对于底层的 SQL 语句是完全透明的。这是一个很好的可靠设计假设。
【讨论】:
【参考方案3】:索引视图与非索引视图非常不同。
引擎可以有效地内联扩展视图,因此可以使用优化器确定的任何表索引。
索引视图具体化(并保持最新)索引。这对视图的用户可用,但仍可能无法使用。
基于您的示例的附加说明 - 索引可能不会像在标志或代码列上那样有效地用于 NULL 条件。
【讨论】:
【参考方案4】:您很可能需要重写您的查询:
SELECT * FROM Users WHERE DeletedON IS NULL
即使 DeletedON 为 NULL,DeletedON = NULL 也不会为真
【讨论】:
【参考方案5】:如果未编入索引,则每次使用定义它的查询都会重新生成视图。如果该查询中的表已编入索引,则将使用该表的索引。
您还可以为视图编制索引,在这种情况下,数据集将提交到物理磁盘,您将拥有两组索引。
【讨论】:
以上是关于SQL:针对表的视图 - 针对视图的查询是不是仍在使用表索引?的主要内容,如果未能解决你的问题,请参考以下文章