2013-06-07 8 views
13

Czy ktoś zdaje się mieć ogólną instrukcję SQL, która będzie zawierała listę wszystkich tabel i indeksów w bazie danych, wraz z ich bieżącym ustawieniem kompresji dla każdej partycji?Zapytanie o wszystkie dane tabeli i kompresję indeksu

Dzięki.

EDIT: To jest tak daleko, jak mam w próbie kwerendy tabel, ale nie jestem pewien sprzężenia jest prawidłowe (Dostaję duplikatów, które wydaje się być spowodowane obecnością indeksów)

SELECT [t].[name], [p].[partition_number], [p].[data_compression_desc] 
FROM [sys].[partitions] AS [p] 
INNER JOIN sys.tables AS [t] ON [t].[object_id] = [p].[object_id] 
+2

Mogłeś napisać jeden w momencie oczekiwania na odpowiedź. :-) Wiesz o sys.partitions, sys.indexes itp. Prawda? –

+2

Nie wiem, jestem szybkim typerem. Miałem iść, ale tbh nie jestem pewien relacji między tabelami, o których wspomniałeś. – Barguast

+0

Powinieneś dołączyć to, co wypróbowałeś w swoim pytaniu; pokazuje innym, że wkładasz trochę wysiłku i nie tylko prosi o kod (lub prosi o napisanie twojego kodu). –

Odpowiedz

24

Pomyślałem, że podzielę się moim ostatnim zapytaniem. Da to dwa zestawy wyników, pierwszy z kompresji danych tabeli, a drugi z kompresji indeksu tabeli.

SELECT [t].[name] AS [Table], [p].[partition_number] AS [Partition], 
    [p].[data_compression_desc] AS [Compression] 
FROM [sys].[partitions] AS [p] 
INNER JOIN sys.tables AS [t] ON [t].[object_id] = [p].[object_id] 
WHERE [p].[index_id] in (0,1) 

SELECT [t].[name] AS [Table], [i].[name] AS [Index], 
    [p].[partition_number] AS [Partition], 
    [p].[data_compression_desc] AS [Compression] 
FROM [sys].[partitions] AS [p] 
INNER JOIN sys.tables AS [t] ON [t].[object_id] = [p].[object_id] 
INNER JOIN sys.indexes AS [i] ON [i].[object_id] = [p].[object_id] AND [i].[index_id] = [p].[index_id] 
WHERE [p].[index_id] > 1 
+0

Aby uzyskać doskonałe wyjaśnienie tej odpowiedzi, zobacz tę odpowiedź: http://stackoverflow.com/a/21262509/61989 –

+0

To nie jest lista PK dla mnie? Czy to normalne? – Zapnologica

2

to powinno załatwić sprawę, przetestować go dla małego podzbioru, aby mieć pewność, że daje ci to, czego potrzebujesz

SELECT DISTINCT s.name [Schema], t.name [Table], i.name [Index Name], p.partition_number, p.data_compression_desc 
-- uncommenting the below line will give you dupes 
--, p.index_id 
FROM sys.schemas s 
INNER JOIN sys.tables t 
    ON s.schema_id = t.schema_id 
    INNER JOIN sys.indexes i 
     ON t.object_id = i.object_id 
    INNER JOIN sys.partitions p 
     ON t.object_id = p.object_id 
ORDER BY s.name, t.name 

powodem są prawdopodobnie coraz powtórzeń dlatego masz wiele rekordów partycji na stole, na przykład multiple index_id, zobacz ten artykuł o MSDN w celu wyjaśnienia, co oznacza identyfikator index_id. Dodanie modelu DISTINCT powinno rozwiązać problem duplikatów:

7

Podczas gdy myślę, że ostatnie zapytania wysłane przez Barguast mogą działać, wciąż jest z nimi problem/coś nie wyjaśnionego wystarczająco dobrze. Zasadniczo indeks_Id 0 oznacza stertę, 1 to indeks klastrowany, a 2 to wszystko inne (indeksy nieklastrowane). Problem z powyższymi zapytaniami polega na tym, że zapytanie o dane nie zadziała, jeśli tabela jest stertą (nawet jeśli w tabeli znajdują się dane). Również kwerenda dla indeksów działa, ponieważ określasz index_Id = 2 i istnieje duplikacja z powodu braku łączenia index_id między sys.indexes i sys.partitions. Jeśli dołączysz do nich, to nie będzie duplikatów w zestawie wynikowym i możesz zrobić znacznie bardziej zrozumiałą wartość parametru index_id niż w (0,1).

W każdym razie ustalone zapytania są poniżej. Dodałem również nazwę indeksu do pierwszego zapytania (zauważ, że to pole będzie puste, jeśli tabela jest stertą). Zauważ też, że nie musisz określać sprzężenia dla index_id w pierwszym zapytaniu, ponieważ where określa (0,1) i może być tylko jeden z nich (innymi słowy możesz go dodać, jeśli chcesz, ale to nie robi " t zrobić różnicę).

-- Data (table) compression (heap or clustered index) 
SELECT [t].[name] AS [Table], 
     [i].[name] AS [Index], 
     [p].[partition_number] AS [Partition], 
     [p].[data_compression_desc] AS [Compression] 
FROM [sys].[partitions] AS [p] 
INNER JOIN sys.tables AS [t] 
    ON [t].[object_id] = [p].[object_id] 
INNER JOIN sys.indexes AS [i] 
    ON [i].[object_id] = [p].[object_id] 
WHERE [p].[index_id] in (0,1) 

-- Index compression (non-clustered index) 
SELECT [t].[name] AS [Table], 
     [i].[name] AS [Index], 
     [p].[partition_number] AS [Partition], 
     [p].[data_compression_desc] AS [Compression] 
FROM [sys].[partitions] AS [p] 
INNER JOIN sys.tables AS [t] 
    ON [t].[object_id] = [p].[object_id] 
INNER JOIN sys.indexes AS [i] 
    ON [i].[object_id] = [p].[object_id] AND i.index_id = p.index_id 
WHERE [p].[index_id] not in (0,1) 
5

Te odpowiedzi są przyzwoite i działają. Ponieważ trochę go upiększyłem za swoją pracę, pomyślałem, że nadszedł czas, aby trochę wesprzeć. Ta kwerenda dodaje schemat z odpowiedzi Jasona (który potrzebowałem). a także rozwiązuje niektóre problemy z łączeniem i łączy wyniki w dość proste podsumowanie.

-- Returns user tables and indexes in a DB and their Compression state 
select s.name [Schema], t.name [Table], i.name [Index], p.data_compression_desc Compression 
    , case when p.index_id in (0, 1) then 'Table' else 'Index' end CompressionObject 
    from sys.tables t 
    join sys.schemas s on t.schema_id = s.schema_id 
    join sys.indexes i on t.object_id = i.object_id 
    join sys.partitions p on (i.object_id = p.object_id and i.index_id = p.index_id) 
where t.type = 'U' 
order by 1, 2, p.index_id, 3 

użyłem tego jako „listy roboczej” do generowania skryptów do kompresji wszystko ponieważ po prostu podnieść, przesunąć db do Azure VM i chcąc zmniejszyć IOPS poprawić perf. Mam nadzieję, że to pomoże komuś tam.

Powiązane problemy