Tempdb填满了

时间:2012-10-17 11:13:56

标签: sql-server-2008 ssis tempdb

我目前正在研究的BI项目从基于SP的复杂流程接收数据,这些流程使用(也)许多临时表。这是我们无法控制的东西(或者我会改变它) 我们在这个项目中的作用主要是基于SSIS。

进程运行正常,但tempdb填满相对较快,然后我们开始出错。

我正在寻找两件事:

  1. 如何防止tempdb“溢出”(或至少减慢速度)?
  2. 如果tempdb溢出时如何清理它? (最好使用SSIS)

2 个答案:

答案 0 :(得分:1)

第一个问题是为什么tempdb正在填充,但您已经确定了填充的来源,因为很可能是由于临时表使用过多。听起来好像重新编写存储过程以使用更少的资源不是一种选择(如果我错了,请纠正我)。

我接下来要考虑的是为tempdb添加更多空间,但这是一个绷带,我相信你已经尝试过了。

您可以做的就是查看tempdb的定义方式。您的初始规模是多少,增长模式是什么?右键单击tempdb并选择属性或让DBA执行此操作。每次SQL Server服务重新启动时,都会删除并重新创建tempdb,并且调整大小和增长的默认值不是生产框的合理值。如果您看到8 MB数据和1 MB日志以及10%增长模式,那么您就有机会提高使用该实例的每个人的性能。我不会详细介绍,但这会导致大量的文件增长,这对于性能来说都是糟糕的。 Maximizing TempDB performance by correct initial sizing上的Optimizing tempdb Performance和msdn。修复tempdb增长不会神奇地让你的问题消失,但如果你在修补东西,它就不会受到伤害。

您可以控制的一件事是SSIS。我假设SSIS正在为你正在加载的每个表调用这些存储过程等等?假设您有多个并行运行的包和/或数据流,您可以查看它们的序列化。这将增加您的总运行时间,但应该在较长的时间段内分摊您的tempdb成本。

另一种选择是查看包中的隔离级别。我在这方面很弱,但我的理解是不同的隔离级别对tempdb的使用有不同的影响。我的,可能是有缺陷的,理解是Snapshot基本上会复制你在tempdb中更新的表,以允许其他人继续访问表,并且只有当你完成它才会将这些更改推回到真实表中。这将比不同的隔离级别花费更多的tempdb空间。虽然没有免费赠品,但是如果你将它切换到默认的Serializable,它可能会降低tempdb的使用率,但代价是更高的阻塞/更少的并发访问。

参考

答案 1 :(得分:0)

你不能!如果你有一个在tempDB上创建大量数据的进程A(你提到的复杂进程),你可以使用进程B来清理那些数据,否则你可能会破坏进程A.

我知道你说你不能但是唯一的解决办法就是找到一种改进过程A的方法,这样它就不会占用太多的空间。或者增加临时数据库的空间