加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – SQL Server标量函数与子查询执行计划分析

发布时间:2020-12-12 08:55:41 所属栏目:MsSql教程 来源:网络整理
导读:任何人都可以帮助我理解以下查询的SQL Server执行计划吗? 我希望子查询版本(查询2)执行得更快,因为它是基于集合的.这似乎是独立运行查询时的情况 – 稍微 – 但执行计划显示查询成本分别为15%和85%: //-- Query 1 (15%) - Scalar FunctionSELECT gi.Galle
任何人都可以帮助我理解以下查询的SQL Server执行计划吗?

我希望子查询版本(查询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,(SELECT COUNT(*) FROM GalleryImageVote WHERE GalleryImageId = gi.GalleryImageId)
FROM
    GalleryImage gi

我在这里想念的是什么;执行计划是否会跳过功能的成本?此外,有关CTE或OVER / PARTITION查询是否更好地提供上述任何一项的任何建议?

先感谢您!

解决方法

永远不要相信执行计划.
让您了解计划是什么非常有用,但如果您想要真正的指标,请始终打开统计数据
set statistics io on
set statistics time on

..并比较实际执行情况.统计数据可能会说预期为15%/ 85%,但实际情况会显示实际转化为什么.

性能调整没有灵丹妙药.随着数据的形状或分布发生变化,即使“最佳”查询也会随着时间而变化.

CTE不会有太大的不同,我不确定您打算如何对此进行PARTITION查询,但您可以尝试左连接表单.

SELECT 
    gi.GalleryImageId,count(v.GalleryImageId) AS Votes
FROM
    GalleryImage gi
    LEFT JOIN GalleryImageVote v ON v.GalleryImageId = gi.GalleryImageId
GROUP BY
    gi.GalleryImageId,gi.FbUserId

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读