Sql server 2005 以编程方式确定数据库上的可用空间?

Sql server 2005 以编程方式确定数据库上的可用空间?,sql-server-2005,shrink,Sql Server 2005,Shrink,好的,我试着四处寻找这个答案,但是没有运气。我在工作的SQL Server上有大约50个数据库,我几乎每天都要检查这些数据库,看看是否可以通过收缩来释放空间。我们的驱动器往往会充满很多,这就是为什么它几乎是一项日常任务 有没有一种快速的方法来检查哪些数据库实际上有可用空间?是否有人知道可以生成每个数据库列表的系统/自定义存储过程或系统视图,以及该数据库上有多少可用空间可以收缩 顺便说一下,使用sql server 2005。可能是WMI或sql视图中的某些内容。但是我得问一下-与购买一些磁盘驱动

好的,我试着四处寻找这个答案,但是没有运气。我在工作的SQL Server上有大约50个数据库,我几乎每天都要检查这些数据库,看看是否可以通过收缩来释放空间。我们的驱动器往往会充满很多,这就是为什么它几乎是一项日常任务

有没有一种快速的方法来检查哪些数据库实际上有可用空间?是否有人知道可以生成每个数据库列表的系统/自定义存储过程或系统视图,以及该数据库上有多少可用空间可以收缩


顺便说一下,使用sql server 2005。

可能是WMI或sql视图中的某些内容。但是我得问一下-与购买一些磁盘驱动器相比,您每天花在这方面的时间成本是多少?

答案是不必担心数据库中有多少可用空间,而是每晚或每周运行一次压缩维护任务。很可能您没有压缩日志文件(这是我通常增长最多的地方)

运行完整备份,然后仅使用TRUNCATE_运行事务日志备份,完成后,在日志文件和数据库上运行DBCC SHRINKFILE()

然后,您只需监视总可用磁盘空间,而不必监视单个数据库的增长

。您必须先执行完整备份和事务日志备份,然后才能正常工作

您可以通过运行“select*from master.dbo.sysdatabases”和运行“select*from[dbname]…sysfiles”来获取有关加载的各个文件的信息。我不是100%,我已经有将近一年没有接触过SQL Server实例了,系统文件可能在“主”数据库中


为每个数据库运行sp_spacedused:

--temporary table to hold database names
CREATE TABLE #Databases (name varchar(255))

INSERT INTO #Databases
SELECT name FROM master..sysdatabases

DECLARE abc CURSOR FOR
   SELECT name FROM #Databases

DECLARE @name varchar(255)
DECLARE @sql nvarchar(1024)

OPEN abc

FETCH NEXT FROM abc INTO @name

WHILE @@FETCH_STATUS = 0 
BEGIN
   --build sql to switch to that database...
   SET @sql = 'USE '+@name
   PRINT @sql
   EXECUTE (@sql)

   --and run spaceused on it
   SET @sql = 'EXECUTE sp_spaceused @UpdateUsage=True'
   PRINT @sql
   EXECUTE (@sql)

   FETCH NEXT FROM ABC INTO @name
END

CLOSE abc
DEALLOCATE abc
DROP TABLE #Databases

样本奇异结果 执行T-SQL:

USE Contoso
EXECUTE sp_spaceused @UpdateUsage=True
database_name: Contoso
database_size:     85.13 MB
unallocated_space: 15.41 MB

reserved:         70,368 KB (68.7 MB)
data:             42,944 KB (41.9 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,224 KB ( 3.1 MB)
DBCC SHRINKDATABASE (Contoso)
EXECUTE sp_spaceused @UpdateUsage=True
database_name: Contoso
database_size:     69.81 MB
unallocated_space:  0.20 MB

reserved:         70,256 KB (68.6 MB)
data:             43,024 KB (42.0 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,032 KB ( 3.0 MB)
结果:

USE Contoso
EXECUTE sp_spaceused @UpdateUsage=True
database_name: Contoso
database_size:     85.13 MB
unallocated_space: 15.41 MB

reserved:         70,368 KB (68.7 MB)
data:             42,944 KB (41.9 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,224 KB ( 3.1 MB)
DBCC SHRINKDATABASE (Contoso)
EXECUTE sp_spaceused @UpdateUsage=True
database_name: Contoso
database_size:     69.81 MB
unallocated_space:  0.20 MB

reserved:         70,256 KB (68.6 MB)
data:             43,024 KB (42.0 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,032 KB ( 3.0 MB)
收缩:

USE Contoso
EXECUTE sp_spaceused @UpdateUsage=True
database_name: Contoso
database_size:     85.13 MB
unallocated_space: 15.41 MB

reserved:         70,368 KB (68.7 MB)
data:             42,944 KB (41.9 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,224 KB ( 3.1 MB)
DBCC SHRINKDATABASE (Contoso)
EXECUTE sp_spaceused @UpdateUsage=True
database_name: Contoso
database_size:     69.81 MB
unallocated_space:  0.20 MB

reserved:         70,256 KB (68.6 MB)
data:             43,024 KB (42.0 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,032 KB ( 3.0 MB)
再次检查空格:

USE Contoso
EXECUTE sp_spaceused @UpdateUsage=True
database_name: Contoso
database_size:     85.13 MB
unallocated_space: 15.41 MB

reserved:         70,368 KB (68.7 MB)
data:             42,944 KB (41.9 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,224 KB ( 3.1 MB)
DBCC SHRINKDATABASE (Contoso)
EXECUTE sp_spaceused @UpdateUsage=True
database_name: Contoso
database_size:     69.81 MB
unallocated_space:  0.20 MB

reserved:         70,256 KB (68.6 MB)
data:             43,024 KB (42.0 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,032 KB ( 3.0 MB)
结果:

USE Contoso
EXECUTE sp_spaceused @UpdateUsage=True
database_name: Contoso
database_size:     85.13 MB
unallocated_space: 15.41 MB

reserved:         70,368 KB (68.7 MB)
data:             42,944 KB (41.9 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,224 KB ( 3.1 MB)
DBCC SHRINKDATABASE (Contoso)
EXECUTE sp_spaceused @UpdateUsage=True
database_name: Contoso
database_size:     69.81 MB
unallocated_space:  0.20 MB

reserved:         70,256 KB (68.6 MB)
data:             43,024 KB (42.0 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,032 KB ( 3.0 MB)

您可以使用sp_spaceused并使用其结果,也可以在sys.allocations_units表中查找自己并计算总使用页面数。您不应该看“数据库”级别,而应该看文件级别,因为有些可能有多个NDF。从sys.database_files开始查看数据库文件中的所有文件。“大小”列将包含数据库中的总页数。将sys.allocation_units中的总页数相加,得到已使用的页数:

with sum_au as (
select data_space_id
    , sum(total_pages) as total_pages
    from sys.allocation_units au 
    group by data_space_id)
select ds.name
    , df.size
    , total_pages as in_use 
    from sys.database_files df
    join sys.data_spaces ds on df.data_space_id = ds.data_space_id
    join sum_au au on au.data_space_id = ds.data_space_id

这就是我所要求的,但显然它比买空间便宜:)。此外,如果我们购买更多的空间,我们的用户很可能会很快再次使用它,即使我们告诉他们删除旧表等等。这是一种恶性循环。我同意Ryanulit的观点。虽然有些问题可以用更多的空间来解决,但您只是隐藏了原始问题,即可用空间的管理。即使在日志文件上,计划的收缩作业也不是一个好主意。代码并没有完全起作用,但它让我朝着正确的方向前进。谢谢抱歉,选择最佳答案时出现延迟。