2

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

进程运行良好,但 tempdb 填满的速度相对较快,然后我们开始出现错误。

我正在寻找两件事:

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

2 回答 2

1

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

我接下来要看的是为 tempdb 添加更多空间,但那是绷带,我相信您已经尝试过。

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

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

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

参考

于 2012-10-17T14:31:50.537 回答
0

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

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

于 2012-10-17T13:22:47.653 回答