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!
+1 za zapytania ... zaoszczędziłem trochę pracy. Dzięki – RThomas
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ę. –
@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. –