为了简单起见:
根据MSDN(链接)以及其他来源,您可以使用以下 TSQL 位获取 tempdb 中当前可用空间的数量:
-- MSDN version
SELECT SUM(unallocated_extent_page_count) AS [free pages],
(SUM(unallocated_extent_page_count)*1.0/128) AS [free space in MB]
FROM sys.dm_db_file_space_usage;
-- The "other" version
SELECT SUM(unallocated_extent_page_count) AS [free pages],
(SUM(unallocated_extent_page_count)*1.0/128) AS [free space in MB]
FROM tempdb.sys.dm_db_file_space_usage;
现在,我们正在使用一个预定的脚本,它可以动态地做它可以做的事情,而不会过度使用空间。在今天之前,MSDN 版本在使用集群 SQL Server 2008 的环境中运行良好,但今天我发现我们使用 SQL Server 2012 和 AlwaysOn 可用性组的新环境之一表现不同。
在那里,“MSDN 版本”几乎没有返回可用空间,而“其他”版本正确显示了 tempdb 中的可用空间。
谁可以给我解释一下这个?在所有 AlwaysOn 副本组之间是否存在共享 tempdb,因此默认情况下,未专门定义 tempdb 以某种方式默认为 tempdb 的某个本地版本,或者这里到底发生了什么?我可以相信针对数据库运行的查询实际上是利用 tempdb.sys.dm_db_file_usage_space 而不是常规的 sys.dm_db_file_usage_space 所指出的?
我正在尝试自己了解更多有关此问题的信息,但我们非常迫切地需要一个答案,所以我在这里询问只是为了确定。谢谢!
看起来特定的 DMO 已更改为适用于所有数据库。这可以通过在 2008r2 服务器上运行以下脚本来演示。
如您所见,输出将是相同的。但是,如果您在 2012 服务器上运行相同的脚本,则输出会有所不同。
Technet 解释说,在 2008R2 中,DMO 仅适用于 tempdb http://technet.microsoft.com/en-us/library/ms174412(v=sql.105).aspx,并且在 2012 年取消了该限制http://technet .microsoft.com/en-us/library/ms174412(v=sql.110).aspx。
希望有帮助。