Скалярная функция SQL Server и анализ плана выполнения подзапроса - PullRequest
6 голосов
/ 20 января 2011

Может ли кто-нибудь помочь мне понять план выполнения SQL Server для следующих запросов?

Я ожидал, что версия подзапроса (Query 2) будет выполняться быстрее, потому что она основана на множествах. Это похоже на случай, когда запросы выполняются независимо - незначительно - однако план выполнения показывает стоимость запроса как 15% против 85% соответственно:

//-- Query 1 (15%) - Scalar Function
SELECT 
    gi.GalleryImageId,
    gi.FbUserId,
    dbo.GetGalleryImageVotesByGalleryImageId(gi.GalleryImageId) AS Votes
FROM 
    GalleryImage gi

//-- Query 2 (85%) - Subquery
SELECT 
    gi.GalleryImageId,
    gi.FbUserId,
    (SELECT COUNT(*) FROM GalleryImageVote WHERE GalleryImageId = gi.GalleryImageId)
FROM
    GalleryImage gi

Что мне здесь не хватает; план выполнения пропускает стоимость функции? Кроме того, есть ли какие-либо предложения относительно того, будет ли любое из вышеперечисленного лучше обслуживаться запросом CTE или OVER / PARTITION?

Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 20 января 2011

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

set statistics io on
set statistics time on

.. и сравните фактические исполнения.Статистика может сказать, что ожидание составляет 15% / 85%, но фактические данные покажут вам, к чему это в действительности приводит.

Серебряной пули для настройки производительности не существуетДаже «лучшие» запросы могут со временем меняться по мере изменения формы или распределения ваших данных.

CTE не будет сильно отличаться, и я не уверен, как вы планируете выполнить запрос PARTITION по этому поводу,но вы можете попробовать форму left join.

SELECT 
    gi.GalleryImageId,
    gi.FbUserId,
    count(v.GalleryImageId) AS Votes
FROM
    GalleryImage gi
    LEFT JOIN GalleryImageVote v ON v.GalleryImageId = gi.GalleryImageId
GROUP BY
    gi.GalleryImageId, gi.FbUserId
4 голосов
/ 20 января 2011

Оптимизатор не знает стоимости функции.

Вы можете увидеть ЦП и Чтения и Продолжительность через профилировщик, хотя

Некоторые связанные ответы на похожие вопросы, Один Два

  • Встроенные табличные функции расширяются до основного запроса (они похожи на макросы как представления)
  • Скалярное (ваше) иТабличные функции с несколькими операторами не являются и являются черными ящиками для «внешнего» запроса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...