我目前正在处理的BI项目接收来自一个基于SPs的复杂进程的数据,这些进程使用(也)许多临时表。这是我们无法控制的事情(否则我会改变它)。
我们在这个项目中的部分主要基于SSIS。
进程运行良好,但tempdb的填充速度相对较快,然后我们开始得到错误。
我在找两样东西:
发布于 2012-10-17 14:31:50
第一个问题是为什么tempdb要填充,但您已经确定了填充的来源,这很可能是由于过度的临时表使用所致。听起来好像重新处理存储过程以使用更少的资源不是一种选择(如果我错了,请纠正我)。
接下来我要看的是为tempdb增加更多的空间,但这是一个绷带,我相信您已经尝试过了。
您可以做的事情是看看你的tempdb是如何定义的。你最初的尺寸是多少,增长模式是什么?右键单击tempdb并选择属性或让DBA执行此操作。每当Server服务重新启动时,会删除并重新创建tempdb,而对于生产框来说,调整大小和增长的默认值都不是正常值。如果您看到具有10%增长模式的8 MB数据和1MB日志,那么您就有极好的机会来提高每个使用该实例的人的性能。我不会详细讨论细节,但是这会导致大量的文件增长,这对性能影响很大。通过正确的初始尺寸使TempDB性能最大化和msdn在优化tempdb性能上。修正tempdb增长并不会神奇地使你的问题消失,但是如果你在修补事情,它不会伤害你。
你能控制的一件事就是SSIS。我假设SSIS正在调用这些存储的过程,对于您正在加载的每个表都是这样吗?如果您有多个包和/或数据流并行运行,则可以查看它们的序列化。这将增加您的总运行时间,但应该在更长的时间内分散您的tempdb成本。
另一种选择是查看包中的隔离级别。我在这方面很薄弱,但我的理解是,不同的隔离级别对tempdb的使用有不同的影响。我的(可能有缺陷的)理解是,快照基本上是复制了你在tempdb中更新的表,以允许其他人继续访问该表,并且只有在完成之后,它才会将这些更改推回真实的表中。这将比不同的隔离级别花费更多的tempdb空间。但是没有免费的,所以如果您将它切换到Serializable的默认值,它可能会降低tempdb的使用率,但代价是阻塞更高/并发访问更少。
参考文献
发布于 2012-10-17 13:22:47
你不能!如果您有一个在tempDB上创建大量数据的进程A (您提到的复杂进程),您可以使用进程B来清理该数据,否则可能会破坏进程A。
我知道你说你不能,但是唯一的解决办法是找到一种改进过程A的方法,这样它就不会占用太多的空间。或增加临时数据库的空间。
https://stackoverflow.com/questions/12933056
复制相似问题