在SQL Server上避免急于后台操作的方法



sql-server tsql (1)

我有一个ETL过程,涉及一个存储过程,大量使用SELECT INTO语句(最少记录,因此更快,因为它们产生较少的日志流量)。 在一个存储过程中发生的一批工作中,几个最昂贵的操作是看起来只是缓存查询结果,然后将它们复制到正在创建的表中的急切假脱机。

急于转储的MSDN文档相当稀少。 有没有人有更深入的了解,这些是否真的有必要(以及在什么情况下)? 我有一些可能或可能不合理的理论,但在消除这些疑问方面没有成功。

.sqlplan文件相当大(160kb),所以我猜这可能是不合理的,直接发布到论坛。

所以,下面是一些可能适用于具体答案的理论:

  • 查询使用一些UDF进行数据转换,例如解析格式化的日期。 这个数据转换是否需要在构造表之前使用急切的假脱机来分配合理的类型(例如varchar长度)?
  • 作为上述问题的扩展,是否有人有更深入的观点,什么在查询中驱动这个操作?

我对假脱机的理解是,这对你的执行计划来说是一个红鲱鱼。 是的,它占用了大量的查询成本,但实际上是SQL Server自动执行的一项优化,以避免代价高昂的重新扫描。 如果要避免假脱机,它所在的执行树的成本将会上升,几乎肯定会增加整个查询的成本。 我没有特别的了解,特别是可能会导致数据库的查询优化器以这种方式解析执行,特别是没有看到SQL代码,但你可能更好的信任它的行为。

但是,这并不意味着您的执行计划无法进行优化,具体取决于您的准备情况以及源数据的波动程度。 当你做一个SELECT INTO ,你会经常看到在你的执行计划中假脱机项目,它可能与读取隔离有关。 如果适合您的特定情况,您可以尝试将事务隔离级别降低到更低的成本和/或使用NOLOCK提示。 我发现在复杂的性能关键型查询中,如果安全且适合您的数据, NOLOCK即使在没有任何理由的情况下也能大大提高查询执行的速度。

在这种情况下,如果尝试使用READ UNCOMMITTEDNOLOCK提示,则可能会消除一些线轴。 (显然,如果可能使您处于不一致的状态,您不希望这样做,但每个人的数据隔离要求都不相同)。 TOP操作符和OR操作符偶尔会导致假脱机,但是我怀疑你正在执行ETL过程中的任何操作。

你说得对,你的UDF也可能是罪魁祸首。 如果您只使用一次UDF,尝试将它们内联以查看您是否获得大的性能优势将是一个有趣的实验。 (如果你不能找出一个方法来将它们与查询内联写入,那可能是因为它们可能导致假脱机)。

最后我要看的是,如果你正在做任何可以重新排序的连接,试着使用提示来强制连接顺序发生在你所知道的最有选择性的顺序中。 这是一个有点触手可及,但如果你已经坚持优化,尝试它并没有什么坏处。





eager