как я могу оптимизировать представления в SQL-сервере для скорости

я создал представления для своего проекта теперь, я хочу оптимизировать их для цели скорости..., как я могу определить, что представление может быть, оптимизируют? индекс, полезный для этого....

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 являются двумя другими представлениями... это возможный оптимизировать это представление?

6
задан girish 29 April 2010 в 09:34
поделиться

3 ответа

Вложение представлений, которые вызывают другие представления, является крайне плохим методом для производительности. Поскольку он не может быть проиндексирован, он должен вызвать все базовое представление, чтобы получить одну запись, которую вернет вершина.Плюс, в конце концов, у вас будет достаточно слоев, и вы достигнете предела того, сколько таблиц вы можете вызвать в представлении (и если view1 вызывает view2 и view3, и оба вызывают одни и те же базовые таблицы, к которым вы присоединяетесь дважды, а не один раз, что часто плохо для производительность. Прекратите вызывать представления из представлений, или вы очень скоро получите непригодную для использования систему.

Мы полностью переделываем такую ​​систему, потому что разработчики приложений сделали это, и многомиллионный клиент покинет нас, если производительность улучшается, и мы не можем улучшить его с помощью этой структуры, поэтому теперь мы сталкиваемся с полной переработкой, за которую клиент не будет платить, потому что ошибка была нашей. НЕ идите по этому пути. Остановитесь сейчас. Представления, вызывающие представления, очень , очень плохо.

19
ответ дан 8 December 2019 в 04:51
поделиться

Представление - это макрос, который расширяется во внешний запрос. Если это не индексированное представление и у вас нет корпоративной версии, оно просто игнорируется.

Итак, если вы объединяете 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

Редактировать, после примера

Вы вкладываете представления поверх представлений. Само представление невозможно оптимизировать.

Как упоминалось, это не может быть проиндексировано

3
ответ дан 8 December 2019 в 04:51
поделиться

В этом случае представление не может быть проиндексировано, поскольку оно содержит ВНЕШНЕЕ СОЕДИНЕНИЕ.

См. Эту статью для получения информации об индексировании представлений и (многих) ограничениях на них: http://technet.microsoft.com/en-us/library/cc917715.aspx

2
ответ дан 8 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: