如果是oracle,rdbms会对sql做分析,不管是在view中的还是直接加在sql上的,都应该同样看待。所以结果总是经过优化的。相信在sql server或者其他的rdbms中也是有这样的优化机制。

解决方案 »

  1.   

    在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 语句生成相同的执行计划。
      

  2.   

    zcflion(土匪) 的说法在逻辑上可以说是对的,但考虑速度的时候就要看它的执行机制,才能得出正确的结论。
      

  3.   

    视图最开始的用途就是提供给数据库用户一个逻辑视图(相对于物理视图-基本表而言),所以视图存储在数据库中只是一段SQL语句,如果在视图上做查询,正如弱水大哥所说的,是要把现有的查询条件和视图的SQL联合起来,进行查询优化,此时视图的最大好处是基本表的变动(增加字段)不会影响到视图,同时也可以简化SQL语句的写法。
    至于sqlserver2000中可以建索引的视图,已经偏离了视图的初始含义了。