在SQL SERVER中,如果没有建立视图索引,实际的优化执行计划是把条件叠加起来一起考虑,如果建立了视图索引,那视图本身有存储,优化执行计划时就象基表一样对待。 看下面从帮助拷贝的信息:视图解析 Microsoft® SQL Server™ 2000 查询处理器处理索引视图和非索引视图的方式不同: 索引视图以与表相同的格式存储在数据库中。查询处理器处理索引视图的方式与基表相同。 只存储非索引视图的源。查询优化器将视图源中的逻辑纳入执行计划,而该执行计划是它为引用非索引视图的 SQL 语句生成的。 SQL Server 查询优化器用于决定何时使用索引视图的逻辑与用于决定何时在表上使用索引的逻辑相似。如果索引视图中的数据包括 SQL 语句,且查询优化器确定视图上的某个索引是低成本的访问路径,则不论 WHERE 子句中是否引用了该视图,查询优化器都将选择此索引。有关更多信息,请参见解析视图上的索引。SQL 语句引用非索引视图时,语法分析器和查询优化器分析 SQL 语句的源和视图的源,并将它们解析为单个执行计划。没有单独用于 SQL 语句或视图的计划。例如,请看下面的视图:USE Northwind GO CREATE VIEW EmployeeName AS SELECT EmployeeID, LastName, FirstName FROM Northwind.dbo.Employees GO在此视图中,这两个 SQL 语句在基表上执行相同的操作且生成相同的结果:/* SELECT referencing the EmployeeName view. */ SELECT LastName AS EmployeeLastName, OrderID, OrderDate FROM Northwind.dbo.Orders AS Ord JOIN Northwind.dbo.EmployeeName as EmpN ON (Ord.EmployeeID = EmpN.EmployeeID) WHERE OrderDate > '31 May, 1996'/* SELECT referencing the Employees table directly. */ SELECT LastName AS EmployeeLastName, OrderID, OrderDate FROM Northwind.dbo.Orders AS Ord JOIN Northwind.dbo.Employees as Emp ON (Ord.EmployeeID = Emp.EmployeeID) WHERE OrderDate > '31 May, 1996'SQL 查询分析器的显示计划功能显示关系引擎为这两个 SELECT 语句生成相同的执行计划。
看下面从帮助拷贝的信息:视图解析
Microsoft® SQL Server™ 2000 查询处理器处理索引视图和非索引视图的方式不同: 索引视图以与表相同的格式存储在数据库中。查询处理器处理索引视图的方式与基表相同。
只存储非索引视图的源。查询优化器将视图源中的逻辑纳入执行计划,而该执行计划是它为引用非索引视图的 SQL 语句生成的。
SQL Server 查询优化器用于决定何时使用索引视图的逻辑与用于决定何时在表上使用索引的逻辑相似。如果索引视图中的数据包括 SQL 语句,且查询优化器确定视图上的某个索引是低成本的访问路径,则不论 WHERE 子句中是否引用了该视图,查询优化器都将选择此索引。有关更多信息,请参见解析视图上的索引。SQL 语句引用非索引视图时,语法分析器和查询优化器分析 SQL 语句的源和视图的源,并将它们解析为单个执行计划。没有单独用于 SQL 语句或视图的计划。例如,请看下面的视图:USE Northwind
GO
CREATE VIEW EmployeeName AS
SELECT EmployeeID, LastName, FirstName
FROM Northwind.dbo.Employees
GO在此视图中,这两个 SQL 语句在基表上执行相同的操作且生成相同的结果:/* SELECT referencing the EmployeeName view. */
SELECT LastName AS EmployeeLastName,
OrderID, OrderDate
FROM Northwind.dbo.Orders AS Ord
JOIN Northwind.dbo.EmployeeName as EmpN
ON (Ord.EmployeeID = EmpN.EmployeeID)
WHERE OrderDate > '31 May, 1996'/* SELECT referencing the Employees table directly. */
SELECT LastName AS EmployeeLastName,
OrderID, OrderDate
FROM Northwind.dbo.Orders AS Ord
JOIN Northwind.dbo.Employees as Emp
ON (Ord.EmployeeID = Emp.EmployeeID)
WHERE OrderDate > '31 May, 1996'SQL 查询分析器的显示计划功能显示关系引擎为这两个 SELECT 语句生成相同的执行计划。
至于sqlserver2000中可以建索引的视图,已经偏离了视图的初始含义了。