2010-06-05 12 views
6

Jestem trochę zaniepokojony domyślnym okresem przechowywania w SQL Server 2008 Change Tracking (który wynosi 2 dni).Okres przechowywania w SQL Server 2008 Zmiana śledzenia

Czy warto ustawić ten okres na np. 100 lat i czy wyłączysz automatyczne czyszczenie w przyszłości, czy może mnie w przyszłości zagrozić nadmiernym wykorzystaniem pamięci masowej i/lub pogorszeniem wydajności? Ktoś ma doświadczenie w tej kwestii?

Odpowiedz

8

Po wyłączeniu funkcji automatycznego czyszczenia najlepiej okresowo przechodzić i usuwać informacje o śledzeniu zmian samodzielnie, wyłączając, a następnie ponownie włączając śledzenie zmian dla każdej tabeli. W przeciwnym razie dane śledzenia będą nadal rosły i rosły.

Nie można bezpośrednio wysyłać zapytań do tabel podstawowych, ale można odczytać ich metadane. Poniższe zapytanie pokazuje względną liczbę wierszy:

select 
    s.name as schema_name 
, t.name as table_name 
, (select sum(rows) from sys.partitions x where o.parent_object_id = x.object_id) as rows_in_base_table 
, o.name as tracking_table 
, p.rows as rows_in_tracking_table 
from sys.objects o 
join sys.tables t on o.parent_object_id = t.object_id 
join sys.schemas s on t.schema_id = s.schema_id 
join sys.partitions p on o.object_id = p.object_id 
where o.name like 'change[_]tracking%' 
    and o.schema_id = schema_id('sys') 
order by schema_name, table_name 

Przeprowadź to w bazie danych i powinieneś uzyskać przybliżony bieżący narzut.

Wszystkie tabele śledzenia zmian są zgodne ze standardowym schematem. Na przykład:

select 
    c.name, c.column_id 
, type_name(user_type_id) as type_name 
, c.max_length, c.precision, c.scale 
, c.is_nullable, c.is_identity 
from sys.columns c 
where object_id = (
    select top 1 object_id from sys.objects o 
    where o.name like 'change[_]tracking%' 
    and o.schema_id = schema_id('sys') 
) 

Kolumny k_% różnią się w zależności od tabeli i odpowiadają kluczom podstawowym śledzonej tabeli. Patrzysz na podstawowy minimalny narzut 18 bajtów + (długość klucza podstawowego) w wierszu. To się sumuje!

Na przykład śledzę niektóre chude tabele bazowe, które mają tylko 15 bajtów szerokości, z 7-bitowym kluczem złożonym. To sprawia, że ​​tabele śledzenia 18 + 7 = 25 bajtów szerokości!

+0

+1 za zapytania ... zaoszczędziłem trochę pracy. Dzięki – RThomas

+0

nawet wiersz o wielkości 100 bajtów dostanie 100 MB po milionie wierszy, więc nie widzę, aby Twój przykład był _too_ krytyczny, chociaż wydaje mi się, że może to być dużo, gdyby był on śledzony w tabeli. Proszę popraw mnie jeżeli się mylę. –

+0

@Sahuagin: w moim przypadku, zakładając, że co najwyżej 10% tabeli zostanie zaktualizowane w dwudniowym oknie, ponoszę koszt nadpisania o wysokości 0,1 * (25/15) = 16,7%. Nie, to nie jest straszne - dla porównania każdy indeks wynosiłby co najmniej (7/15) = 46,7%. Nieograniczona retencja - to kosztowałoby 166%. Ponadto, nie wiem z góry, jeśli tabele zmian używają kompresji danych, ale jeśli nie, i jeśli moja tabela * jest * skompresowana, to procenty stają się znacznie większe. –

Powiązane problemy