估计用于数据库空间和散列连接的临时空间

可以针对数据库空间和散列连接而估计并增加临时空间量。如果这样做,可以防止内存可能溢出到磁盘上的临时空间。

可以使用以下原则估计要分配的临时空间量:

散列连接(其工作方式是从连接中一个表的行构造散列表,然后在其他表的行探测该散列表)可使用大量内存并有可能导致磁盘上临时空间的溢出。散列表大小由用来建造该散列表的表的大小决定(通常为连接中两个表中的较小者),在应用过滤器之后,可减少行的数量并且可能减少列的数量。

将散列连接分区组织到页面中。每页拥有一个头。64 位平台上数据库中的头和元组比 32 平台上构件中的要大。每个页面的大小为基本页面大小(根据系统的不同为 2K 或 4K),除非单个行需要更多的空间。如果需要更多空间,那么可以向行的长度添加字节。

可以使用以下公式估计在散列连接中散列表需要的内存量:
hash_table_size = (32 bytes + row_size_smalltab) * num_rows_smalltab
其中,row_size_smalltabnum_rows_smalltab 分别指散列连接的两个表中的较小者的行大小和行数。

例如,假设您拥有一个长度为 80 字节的页头以及一个长度为 48 字节的行头。由于必须将每行调整为 8 字节,因此您可能需要向行长度添加 7 个字节,如这些公式中所示:

per_row_size = 48 bytes + rowsize + mod(rowsize, 8)
page_size = base_page_size (2K or 4K)
rows_per_page = round_down_to_integer((page_size - 80 bytes) / per_row_size)  

如果 rows_per_page 的值小于 1,那么将 page_size 的值增加至 base_page_size 的最小倍数,如以下公式所示:

size = (numrows_smalltab / rows_per_page) * page_size

可使用 DS_NONPDQ_QUERY_MEM 配置参数来为所有查询(除 PDQ 查询外)配置排序内存。

有关更多信息,请参阅散列连接为使用散列连接、聚集和其他内存密集型元素的查询分配更多内存