相关疑难解决方法(0)

为什么执行计划包含用于持久保存的计算列的用户定义函数调用?

我有一个包含2个计算列的表,两个都将"Is Persisted"设置为true.但是,在查询中使用它们时,执行计划会显示用于计算列的UDF作为计划的一部分.由于列数据是由UDF在添加/更新行时计算的,为什么计划会包含它?

当这些列包含在查询中时,查询速度非常慢(> 30s),当排除它们时,查询速度非常快(<1s).这使我得出结论,查询实际上是在运行时计算列值,这不应该是这种情况,因为它们被设置为持久化.

我在这里错过了什么吗?

更新:这里有关于我们使用计算列的推理的更多信息.

我们是一家体育公司,有一个客户将完整的球员名称存储在一个列中.他们要求我们允许他们分别按名字和/或姓氏搜索玩家数据.值得庆幸的是,他们使用一致的播放器名称格式 - LastName,FirstName(NickName) - 因此解析它们相对容易.我创建了一个UDF,调用CLR函数来使用正则表达式解析名称部分.因此,显然调用UDF(后者又调用CLR函数)非常昂贵.但由于它仅用于持久列,我认为它只会在我们将数据导入数据库的一天中使用几次.

performance calculated-columns sql-server-2008-r2 sql-execution-plan

18
推荐指数
1
解决办法
2534
查看次数