所以我有这个数据库可以帮助组织学术会议的信息,但我们有时需要知道某个项目是否“不完整” - 可能使某些内容不完整的规则有点复杂,所以我将它们构建到标量函数,如果项目完成则返回true,否则返回0。
我遇到的问题是,当我在一个大数据表上调用该函数时,返回结果大约需要1分钟。这导致网站暂停。
我认为我对功能本身无能为力。但我想知道是否有人知道这些情况下的任何技术?当你拥有像这样的大功能时,你会做什么呢?我可以实际存储函数的结果,然后不时刷新它吗?是否有一种好的有效方式来存储它,但如果更新记录则刷新它?我认为我可以将其作为触发器或其他东西,但如果有人进行了大量更新,则需要永远。
谢谢,
麦克
答案 0 :(得分:1)
如果函数是确定性的,您可以将其添加为计算列,然后对其进行索引,这可能会提高您的性能。
MSDN文档。
答案 1 :(得分:1)
问题是该函数查看单个记录并具有诸如“如果此列为空”或“如果该列大于0”的逻辑。这个逻辑基本上是查询优化器的黑盒子。它可能会使用这些字段上的索引,但它无法知道它。它必须在每个可用记录上运行此逻辑,而不是使用功能性事项中的条件来削减结果集。用数据库的说法,我们可以说UDF不是sargable。
所以你想要的是将不完整会议的逻辑构建到一个结构中的一些方法,查询优化器可以更好地利用:匹配条件到索引等等。在我的脑海中,您执行此操作的选项包括视图或计算列。
答案 2 :(得分:1)
SQL Server中的标量UDF目前表现非常糟糕。我只把它们当作精心策划的最后手段。有可能使用其他技术解决您的问题(即使是深层嵌套的视图或内联TVF,它们构建了所有规则并重新加入),但是如果没有看到要求,很难说清楚。
答案 3 :(得分:0)
如果您的功能效率低下,您将不得不处理过时的数据或缓慢的结果。
听起来你更关心性能,所以就像@cmsjr所说的那样,将数据添加到表中。
此外,创建一个cron作业以定期刷新结果。也许在数据库表中添加updated
列,然后cron作业只需要重新处理这些行。
还有一件事,功能有多复杂?你可以通过将它从SQL中拉出来减少函数的运行时间,或者在数据库层之上写一层吗?
答案 4 :(得分:0)
我遇到过这样的情况:在SQL Server 2000中,至少有一个函数执行起来非常糟糕,只是打破逻辑并将其放入查询中会极大地加快速度。这是一个边缘情况,但如果你认为功能很好,那么你可以试试。否则,我会考虑计算列并将其存储为其他人建议的。
答案 5 :(得分:0)
不要太确定你无法调整你的功能。
通常,通过“完整性”检查,您最糟糕的时间是记录实际完成的时间。对于其他所有内容,您可以提前中止,因此要么先测试最快计算的案例,要么最有可能导致该记录被标记为不完整的案例。
对于批量更新,您必须只是等待,或者想出一个系统,您可以先通过更快的检查来运行较不完整的系统,然后在后台进行更彻底的检查。
答案 6 :(得分:0)
正如Cade Roux所说Scalar functions are evil他们被解释为每一行,因此在性能方面是一个大问题。如果可能,使用表值函数或计算列