gir*_*ish 6 sql t-sql performance sql-server-2005 views
我已经为我的项目创建了视图,现在我想为速度目的优化它们...我如何识别视图可以优化?索引对此有用....
let's say the following example...
    SELECT        dbo.vw_WebInventory.skref AS SaleID, dbo.vw_WebInventory.lot_number AS LotNumber, dbo.vw_WebInventory.Description, 
                             dbo.vw_WebInventory.Image AS HasImage, dbo.vw_WebInventory.Sold, dbo.vw_WebInventory.Withdrawn, dbo.vw_WebTopBids.TopBid, 
                             ISNULL(dbo.vw_WebInventory.Mins_Extend_y, 0) AS BidTimeExtend, dbo.Sale.SaleTypeID, dbo.Sale.ClosingDate, dbo.vw_WebInventory.ExDate, 
                             dbo.vw_WebInventory.CurrDate, CASE WHEN vw_WebInventory.ExDate > ISNULL(vw_WebInventory.LotClosingDate, Sale.ClosingDate) 
                             THEN 1 ELSE 0 END AS ShowBidMessage
    FROM            dbo.vw_WebInventory INNER JOIN
                             dbo.Sale ON dbo.vw_WebInventory.skref = dbo.Sale.SaleID LEFT OUTER JOIN
                             dbo.vw_WebTopBids ON dbo.vw_WebInventory.skref = dbo.vw_WebTopBids.CatNumber AND dbo.vw_WebInventory.lot_number = dbo.vw_WebTopBids.LotNumber
其中vm_webTopBids和vm_WebInventory是两个不同的视图......是否可以优化此视图?
HLG*_*GEM 19
嵌套视图调用其他视图是一种非常糟糕的性能技术.由于它无法编入索引,因此必须调用整个底层视图才能获得top返回的一条记录.另外,最终你获得了足够的图层,并且你达到了你可以在一个视图中调用多少个表的限制(如果view1调用view2和view3并且两个都调用相同的底层表,那么你加入它们两次而不是一次,这通常是不好的停止从视图中调用视图,否则很快就会出现一个不可用的系统.
我们正在完全重新设计这样一个系统,因为应用程序开发人员这样做了,价值数百万美元的客户端将离开我们,除非性能提高,我们无法通过这种结构改进它,所以现在我们面临一个完整的重新设计,客户不会支付,因为错误是我们的.不要走这条路.现在停下来 调用视图的视图非常非常糟糕.
视图是扩展到外部查询的宏。除非它是索引视图并且您有企业版,否则它会被忽略。
因此,如果您联接 3 个视图,并且每个视图使用 5 个表,则您将获得包含 15 个表的大联接。
您最好的选择是数据库优化顾问或缺少索引脚本:
SELECT
    CONVERT(decimal(28, 1), migs.avg_total_user_cost * migs.avg_user_impact *
    (migs.user_seeks + migs.user_scans)) AS improvement_measure,
    'CREATE INDEX missing_index_' + CONVERT(varchar, mig.index_group_handle) +
    '_' + CONVERT(varchar, mid.index_handle) + ' ON ' + mid.statement + ' (' +
    ISNULL(mid.equality_columns, '') +
    CASE WHEN mid.equality_columns IS NOT NULL AND
              mid.inequality_columns IS NOT NULL THEN ','
         ELSE ''
    END + ISNULL(mid.inequality_columns, '') + ')' + ISNULL(' INCLUDE (' +
                                                            mid.included_columns +
                                                            ')', '') AS create_index_statement,
    migs.*,
    mid.database_id,
    mid.[object_id],
    mig.index_group_handle,
    mid.index_handle
FROM
    sys.dm_db_missing_index_groups mig INNER JOIN 
    sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle INNER JOIN
    sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE
    CONVERT(decimal(28, 1), migs.avg_total_user_cost * migs.avg_user_impact *
    (migs.user_seeks + migs.user_scans)) > 10 AND
    database_id = DB_ID()
ORDER BY
    migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks +
                                                       migs.user_scans) DESC
编辑,在示例之后
您将视图嵌套在视图之上。视图本身无法进行优化。
如前所述,这不能被索引