2013-07-03 4 views
5

Ein Kollege von mir zeigt mir, als einen Datensatz einer Tabelle zu zählen, die folgende Ansicht:uncoditioned Count (*) vs Systemtabellen

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 

führt dramatisch schneller als ein reguläres

select count(*) from table 

warum das? sollte die db-Engine nicht so optimiert werden, dass sie immer dem kürzesten Weg folgt? Was ist der Nachteil in der Systemtabellenansicht Lösung?

Antwort

9

Der in den Metadaten gespeicherte Wert ist nicht garantiert. DBCC UPDATEUSAGE kann verwendet werden, um dies zu korrigieren, wenn es passiert (weniger wahrscheinlich seit SQL Server 2000)

Auch ist es nicht transaktional konsistent. Sie können einen Zählwert lesen, der von einer nicht festgeschriebenen Transaktion aktualisiert wurde.

Und es ist möglich, dass diese Werte auch manuell aktualisiert werden.

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 
+0

zwei gute Punkte, die zweite, die wir vermuteten, aber die erste wurde nur vermutet –

Verwandte Themen