2013-07-03 11 views
5

kolega z kopalni pokazać mi, niż liczyć zapis tabeli następujący widok:uncoditioned Count (*) vs tabelach systemowych

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 

wykonuje znacznie szybciej niż zwykły

select count(*) from table 

dlaczego to? nie należy optymalizować silnika db, aby zawsze podążać najkrótszą ścieżką? Jaka jest wada w widoku tabel systemowych?

Odpowiedz

9

Wartość zapisana w metadanych nie może być poprawna. DBCC UPDATEUSAGE można użyć do skorygowania tego, gdy się to zdarzy (mniej prawdopodobne od czasu SQL Server 2000)

Również nie jest to transakcyjnie spójne. Możesz odczytać wartość licznika zaktualizowaną przez niezatwierdzoną transakcję.

Możliwe jest również ręczne aktualizowanie tych wartości.

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

dwa dobre punkty, drugi możemy domyślić, ale pierwszy z nich był właśnie podejrzewał –