用批量加载中使用的大型参考表制作临时表的优势



如果我正在批量加载数据,并且作为加载管道的一部分,我正在连接到一个非常大的引用表以获取一些值,那么在批量数据加载过程中,从该大型引用表创建临时表并使用它有好处吗?

我想知道在每个批处理过程中,是否必须从磁盘中取出引用表,通过将表加载到临时表中,我可以将其保存在内存中,并绕过昂贵的磁盘操作。或者,在批量加载期间使用非常大的引用表的最佳实践是什么?顺便说一句,这张桌子大约有3场演出那么大,但不太大,无法记忆。

在批量数据加载期间,从该大型引用表创建临时表并使用它是否有优势

否。

SQL Server中的数据被组织成8kb的块,称为"块";页面";。SQL Server总是通过对RAM中的页面执行操作来满足查询。如果它需要的页面不在RAM中,它会将它们从磁盘拉到RAM,然后在RAM中执行操作。然后这些页面将保留在RAM中。

"永远";。

除了。。。如果我们没有足够的RAM来存储所有的数据怎么办?

如果SQL Server需要一个当前不在RAM中的页面,但没有更多的RAM可供其使用,则它必须清除一些其他页面,为这个新页面腾出空间。它有一个算法来决定应该清除哪个页面,大致基于已经被"清除"的内容;最近最少使用的";(我相信从技术上讲是LRU2(。

最终结果是:如果您刚刚从VeryLargeReferenceTable中读取完一堆行,并且满足该查询所需的所有页面都能够放入RAM,那么只要SQL不会因为运行其他查询而被迫将页面从RAM中清除,那么在运行下一批时,VeryLargeReferenceTable的所有数据仍在RAM中。

现在,如果您将临时表创建为VeryLargeReferenceTable(以下简称VLRT(的副本,该怎么办?

SQL Server显然必须从VLRT中读取数据才能做到这一点——这意味着要将VLRT页面放入RAM!如果我们直接加入VLRT,它就必须这么做!

但它还必须将VLRT中的所有数据写入临时表。因此,它还必须为RAM中的临时表分配新的页!这些将是";脏的";页面(它们已经被修改(,所以如果我们开始受到内存压力,我们可能不得不将它们写入磁盘!诶呀

除此之外,您可能(希望!(在VLRT上有一个用于此查询的有用索引,是吗?我们也想在临时表上创建索引,对吧?更多的页面分配、更多的页面IO、更多的CPU时间来构建索引。

因此,通过使用临时表,我们在没有临时表的情况下做了所有必须做的事情,还有更多。

最新更新