我们正在调整我们公司刚刚编写的大型应用程序。该调整的一部分包括调整数据库。我们在 AIX 上运行 DB2 LUW。具体来说,我们使用的是 9.7 Fix Pack 4(尽管我们希望在今年的某个时候迁移到 10.1 Fix Pack 2)。
我们最初构建了仅根据数据大小需要的表空间(即,如果所有表都适合 4K 表空间,我们只创建 4K 表空间,我们的想法是为什么创建表空间以在未使用时占用更多磁盘)。这对于临时表空间也是一样的。
开发人员告诉我们,他们通过添加 32K 临时表空间获得了更好的性能。所以他们所有的表都进入了 4K、8K 或 16K 的表空间。然而,他们添加了一个 32K 临时(有自己的缓冲池),并声称他们将应用程序的一些事务时间减半。
当我想到它时,我认为这是有道理的。我猜优化器将 32K 空间视为执行连接/排序的好地方,并且可以使用 32K 与 4K 的更多内存。
我的同事说他(不管上述情况如何),他在某处读到 DBA 应该始终将临时表空间放入他们自己的缓冲池中。当我要求他提供阅读链接时,他不记得了。
我想知道......临时表空间是否应该总是有自己的缓冲池?这对连接/排序性能有帮助吗?这是一个好习惯吗?
其次,总是为这些连接/排序创建一个 32K 缓冲池和 32K 临时表空间是否有意义?
首先,您必须有一个与表空间的页面大小相匹配的缓冲池。因此,如果临时表空间是唯一一个具有 32K 页大小的表空间,那么它将拥有供其独占使用的缓冲池。
如果您有其他具有 32K 页大小的表空间,则仅监视系统性能会告诉您是否可以从单独的临时空间缓冲池中受益。
您可以使用
select * from sysibmadm.mon_bp_utilization
来查看缓冲池命中率并select * from table (mon_get_bufferpool(NULL,NULL))
检查页面清理器活动(理想情况POOL_NO_VICTIM_BUFFER
下POOL_DRTY_PG_STEAL_CLNS
应该为 0)。如果您发现缓冲池命中率下降或脏页争用率高与临时空间使用(在POOL_TEMP_DATA_L_READS
中的峰值select * from table (mon_get_tablespace(NULL,NULL))
)同时出现,那么为相关临时表空间创建一个适当大小的单独缓冲池可能会很有用。