Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przytnij tabelę i AKTUALIZUJ statystyki

Statystyki nie są automatycznie aktualizowane, dopóki statystyki nie będą ponownie potrzebne. czyli TRUNCATE tego nie robi.Więc „Nie”.

Oryginalna odpowiedź brzmiała „Tak”, ponieważ nie jest to automatyczne w ramach TRUNCATE. Zależy jak czytasz pytanie :-)

Pamiętaj, że statystyki są aktualizowane automatycznie, gdy wymaga tego zapytanie (np. zmiana liczby wierszy). Od „Statystyki indeksu " w BOL

Jednym ze sposobów weryfikacji przy użyciu STATS_DATE ...

SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id)
FROM
   sys.indexes 
WHERE
   object_id = OBJECT_ID('MyTruncatedTable')


Edytuj :Chciałem się upewnić :-)

Zobaczysz, że statystyki są aktualizowane tylko przez instrukcje SELECT, a nie INSERT, DELETE lub TRUNCATE

IF OBJECT_ID('dbo.foo') IS NOT NULL DROP TABLE dbo.foo
CREATE TABLE dbo.foo (
    bar int NOT NULL IDENTITY (1, 1) PRIMARY KEY,
    thing int NOT NULL
)
CREATE INDEX IX_thing ON dbo.foo (thing)

INSERT dbo.foo (thing) SELECT c1.object_id FROM sys.columns c1, sys.columns c2
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS AfterLoad
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')

SELECT DISTINCT thing FROM dbo.foo ORDER BY thing DESC
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS AfterFirstQuery
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')

DELETE TOP (50000) dbo.foo
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS AfterDelete
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')

SELECT DISTINCT thing FROM dbo.foo ORDER BY thing DESC
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS After2ndQuery
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')

TRUNCATE TABLE dbo.foo
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS AfterTruncate
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')

SELECT DISTINCT thing FROM dbo.foo ORDER BY thing DESC
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS After3rdQuery
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LEFT JOIN Znacznie szybciej niż INNER JOIN

  2. Jak dynamicznie tworzyć arkusze robocze za pomocą XSLT?

  3. 11 sposobów zwracania kluczy obcych w bazie danych SQL Server za pomocą T-SQL

  4. Dlaczego SELECT DISTINCT a, b FROM... zwraca mniej rekordów niż SELECT DISTINCT A + '|' + B OD...?

  5. Konwertuj float na varchar w SQL Server bez notacji naukowej