我有两个包含 600K 行的表之间的关系,我的第一个问题是,这是很多数据吗?看起来并不多(就行数而言,而不是字节数)
我可以编写这样的查询
SELECT EntityID, COUNT(*)
FROM QueryMembership
GROUP BY EntityID
它现在就完成了,但是当我这样做时。
SELECT EntityID, COUNT(*)
FROM QueryMembership
WHERE PersonID IN (SELECT PersonID FROM GetAcess(1))
GROUP BY EntityID
尽管只返回了大约 183 行,但该操作需要 3-4 秒才能完成。 SELECT * FROM QueryMembership
大约需要 12-13 秒。
我不明白的是,当我引入这个表值函数时,这样的过滤器怎么会花这么长时间。它本身的函数根本不需要任何时间来返回它的结果,无论我将其编写为 CTE 还是一些奇怪的子查询,结果都是相同的。
但是,如果它推迟过滤器,则通过将第一个选择的结果插入临时表#temp
,然后使用GetAccess
UDF,整个事情会进行大约三个快了几倍。
我真的很想获得有关此事的深入技术帮助。我应该从哪里开始查看,以及如何分析执行计划以弄清楚发生了什么。
最佳答案
有一系列关于执行计划以及如何阅读和解释它们的精彩帖子 - 还有一本关于该主题的完全免费的电子书! - 在优秀的 Simple-Talk 网站上。
检查一下 - 非常值得花时间!
关于sql-server - 什么是 SQL Server 数据过多以及如何分析我的执行计划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1784230/