sys.dm_db_partition_stats
DMVに問題があります。 InMemoryテーブル(ハッシュインデックス、列ストア、従来のBツリーを含む)があり、このクエリを介して行数を取得しようとすると、すべてのInMemoryテーブルに0が表示されます。
WITH cte AS
(
SELECT t.name as table_name,
SUM(s.used_page_count) AS used_pages_count,
SUM(CASE
WHEN (i.index_id < 2) THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
ELSE lob_used_page_count + row_overflow_used_page_count
END) AS pages,
MAX(s.row_count) AS row_count
FROM sys.dm_db_partition_stats s
INNER JOIN sys.tables t
ON s.object_id = t.object_id
INNER JOIN sys.indexes i
ON i.object_id = t.object_id
AND s.index_id = i.index_id
GROUP BY t.name
)
SELECT cte.table_name,
CAST((cte.pages * 8.)/1024 AS DECIMAL(10,3)) AS table_size_mb,
CAST(((CASE WHEN cte.used_pages_count > cte.pages
THEN cte.used_pages_count - cte.pages
ELSE 0
END) * 8./1024) AS DECIMAL(10,3)) AS indexes_mb,
cte.row_count
FROM cte
ORDER BY 2 DESC
;
このクエリでは、テーブルとInMemoryテーブルのインデックスで使用されるスペースを取得できないことはわかっていますが、行数は機能するはずです。
実行するとき:
SELECT * FROM sys.dm_db_partition_stats
row_countの列は、すべてのInMemoryテーブルでゼロ以外の行数であることがわかります。 Microsoft SQL Serverにバグはありますか(SQL2016SP1以前のバージョンでこれを試しました)?それとも私は何か間違ったことをしていますか?私が作成したすべてのInMemoryテーブルは空ではないため、SELECT *は適切な行数を表示しました。
もう1つのポイント-InMemoryテーブルのみをフィルタリングするテーブル名またはLIKEを使用してフィルタリングWHERE句を追加すると、ゼロ以外の行数も返されます...