web-dev-qa-db-ja.com

sys.dm_db_partition_stats-InMemoryテーブルの行数が正しくありません

sys.dm_db_partition_statsDMVに問題があります。 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句を追加すると、ゼロ以外の行数も返されます...

1
XWildWolf

インメモリテーブルの詳細は、「通常の」動的管理ビュー、またはsys.dm_db_partition_statsなどのDMVを使用して常に表示できるとは限りません。

代わりに、MSDNで詳しく説明されているインメモリビューを使用する必要があります。

たとえば、 このページ は、インメモリテーブルの行とテーブルのサイズを計算する方法について説明しています。

MSSQLTips には、インメモリ関連のDMVの適切な開始リストがあります。

1
Max Vernon