sql-server - 什么是 SQL Server 数据过多以及如何分析我的执行计划

标签 sql-server sql-server-2005 tsql user-defined-functions

我有两个包含 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/

相关文章:

php - 使用 CakePHP 运行一个 sql server 存储过程

tsql - 将日期转换为儒略日期,然后存储在 SQL Server 2005 中的数字字段中

sql - 为什么 SQL Server 不使用我的索引? (过滤连接的索引 View )

c# - 如何结合SQL查询使用TableAdapterManager及相关数据表

sql - 连接多个表(多对多关系)

sql-server - 为什么将和乘以其他数字时精度会降低

sql - 使用 Oracle SQL Developer 作为我的客户端时如何为 SQL Server 调用 sp_help [table]

sql - 恢复的三个阶段 : the analysis phase, 重做阶段,最后是撤消阶段

SQL Server 2008 : Why won't this round to two decimal places?

SQL Server,在 SQL 中创建临时表时出现问题