可以针对数据库空间和散列连接而估计并增加临时空间量。如果这样做,可以防止内存可能溢出到磁盘上的临时空间。
散列连接(其工作方式是从连接中一个表的行构造散列表,然后在其他表的行探测该散列表)可使用大量内存并有可能导致磁盘上临时空间的溢出。散列表大小由用来建造该散列表的表的大小决定(通常为连接中两个表中的较小者),在应用过滤器之后,可减少行的数量并且可能减少列的数量。
将散列连接分区组织到页面中。每页拥有一个头。64 位平台上数据库中的头和元组比 32 平台上构件中的要大。每个页面的大小为基本页面大小(根据系统的不同为 2K 或 4K),除非单个行需要更多的空间。如果需要更多空间,那么可以向行的长度添加字节。
hash_table_size = (32 bytes + row_size_smalltab) * num_rows_smalltab其中,row_size_smalltab 和 num_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 查询外)配置排序内存。
有关更多信息,请参阅散列连接和为使用散列连接、聚集和其他内存密集型元素的查询分配更多内存。