2010-04-29 10 views
6

he creado vistas para mi proyecto ahora quiero optimizarlas para la velocidad ... ¿cómo puedo identificar que la vista se puede optimizar? es muy útil para este índice ....cómo puedo optimizar las vistas en el servidor sql para la velocidad

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 

donde vm_webTopBids y vm_WebInventory son dos punto de vista diferente ... es posible optimizar este punto de vista?

Respuesta

18

de anidamiento que llaman a otros puntos de vista es una herramienta extremadamente mala técnica para el rendimiento. Como no puede indexarse, tiene que llamar a toda la vista subyacente para obtener el registro que devolverá la parte superior. Además, eventualmente obtienes suficientes capas y alcanzas el límite de cuántas tablas puedes llamar en una vista (Y si view1 llama a view2 y view3 y ambas llaman a las mismas tablas subyacentes a las que te estás uniendo dos veces en vez de una, lo que a menudo es malo para rendimiento. Deje de llamar vistas desde vistas o muy pronto tendrá un sistema inutilizable.

Estamos rediseñando por completo un sistema como este porque los desarrolladores de la aplicación hicieron esto y el cliente multimillonario nos va a dejar a menos el rendimiento mejora y no podemos mejorarlo con este estándar, por lo que ahora enfrentamos un rediseño completo que el cliente no pagará porque el error fue nuestro. NO continúe por este camino. Detente ahora. Las vistas que llaman a las vistas son muy, muy mal.

+0

Gracias por la ayuda ... – girish

3

Una vista es una macro que se expande en la consulta externa. A menos que sea una vista indexada y tenga una edición empresarial, simplemente se ignorará.

Así que si unes 3 vistas y cada vista usa 5 tablas, tienes una combinación grande con 15 tablas.

Es mejor apuesta es la Database Tuning Advisor o un script índice que falta:

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 

Editar, tras ejemplo

Usted está anidando puntos de vista sobre la parte superior de puntos de vista. No hay optimizaciones posibles de la vista en sí.

Como se ha mencionado, esto no se puede indexar

+0

agregar índice para ver es útil para optimizar la velocidad? – girish

+0

@girish: es difícil de decir sin más información. Personalmente, utilizaría el DTA o el script anterior antes de considerar las vistas indizadas – gbn

+0

He mencionado el ejemplo anterior ... – girish

2

En este caso, la vista no puede ser indexado, ya que contiene una combinación externa.

Consulte este artículo para obtener información sobre los puntos de vista de indexación y las (muchas) las restricciones sobre ellos: vistas http://technet.microsoft.com/en-us/library/cc917715.aspx

+0

es esta media, la vista superior es perfecta, ya que ... no se puede optimizar más – girish

+0

Depende mucho de lo que digas. Como se sugiere en otra parte, considere optimizar primero las tablas subyacentes. Si el patrón de acceso necesita usar la vista de forma extensa, mejorar esta vista brindará los mayores beneficios, vea si puede modificarla para que cumpla con las restricciones de la vista indexada y luego agregue los índices apropiados. –

Cuestiones relacionadas