Andy Mallon looks back at a contribution by Junior DBA Andy, this one on checking file sizes:
This is every DBA’s favorite game. Figuring out what DMV contains the data you want. It turns out there are two places that database file size info is maintained. Each database has
sys.database_files which has information for that database. The master database also has
sys.master_files, which contains information for every database.
sys.master_files seems like it would be the obvious choice: everything in one view in master is going to be easier to query than hitting a view in a bunch of different databases. Alas, there’s a minor snag. For tempdb,
sys.master_files has the initial file size, but not the current file size. This is valuable information, but doesn’t answer the use cases we set out above. I want to know the current file sizes. Thankfully,
sys.database_files has the correct current file sizes for tempdb, so we can use that.
sys.database_files seems like it’s going to be the right move for us then. Alas, this isn’t quite perfect either. With Log Shipping, and Availability Group secondaries, if you’ve moved data files to a different location,
sys.database_files will contain the location of the files on the primary database. Thankfully,
sys.master_files has the correct local file locations for user databases, so we can use that.
Ugh, so it looks like the answer is “both”… we’ll need to use
sys.database_files for tempdb, and
sys.master_files for everything else.
Click through for the script, including Andy’s critical reflection on how Past Andy has failed him.