5

私の同僚は、テーブルのレコードを数えるために、次のビューを見せてくれます。

CREATE VIEW [SPR].[TablesCount]

AS

SELECT     s.name cSchema,
           t.name cTable,
           sum(p.rows) eRowCount
FROM       sys.tables t
INNER JOIN sys.schemas s
ON         s.schema_id = t.schema_id
INNER JOIN SYS.partitions p
ON         p.object_id = t.object_id
WHERE      p.index_id < 2
GROUP BY   s.name,
           t.name

通常よりも劇的に高速に実行します

select count(*) from table

これはなぜですか?最短パスを常にたどるようにdbエンジンを最適化するべきではありませんか? システム テーブル ビュー ソリューションの欠点は何ですか?

4

1 に答える 1

9

メタデータに格納された値が正しいとは限りません。DBCC UPDATEUSAGEこれが発生したときにこれを修正するために使用できます (SQL Server 2000 以降では可能性は低くなります)

また、トランザクションの一貫性もありません。コミットされていないトランザクションによって更新されたカウント値を読み取ることができます。

また、これらの値を手動で更新することもできます。

CREATE TABLE dbo.YourTable(X INT)

UPDATE STATISTICS dbo.YourTable WITH ROWCOUNT = 1000000

SELECT     sum(p.rows) eRowCount
FROM       sys.partitions p
WHERE      P.object_id =object_id('dbo.YourTable') AND p.index_id < 2
于 2013-07-03T10:51:27.970 に答える