2011-08-15 34 views
6

In a previous question @Morawski mówił, że "tabela z 1 000 kolumn i 44 000 wierszy To około 330 MB, to tyle, ile przeglądarka używa tylko na kilku otwartych kartach" .Jak zmierzyć rozmiar tabeli w GB w tabeli w SQL

Ile kolumn i wierszy powinna zawierać tablica informująca o jej wielkości: > 10 GB (supozycja tabeli ma tylko podwójne wartości).

Jak firma @Morawski wywnioskowała, że ​​1 000 kolumn i 44 000 to 330 MB?

Czy istnieje jakiś skrypt, który mógłby to powiedzieć w SQL?

+3

W poprzednim pytaniu wszystkie kolumny były podwójne. To dość ważne w obliczeniach. –

Odpowiedz

7
-- Measures tables size (in kilobytes) 
-- Tested in MS SQL Server 2008 R2 

declare @t table (
name nvarchar(100), [rows] int, [reserved] nvarchar(100), [data] nvarchar(100), [index_size] nvarchar(100), [unused] nvarchar(100) 
) 
declare @name nvarchar(100) 

declare tt cursor for 
Select name from sys.tables 
open tt 

fetch next from tt into @name 
while @@FETCH_STATUS = 0 
begin 
    insert into @t 
    exec sp_spaceused @name 
    fetch next from tt into @name 
end 

close tt 
deallocate tt 

select name as table_name, [rows] as rows_count, data + [index] as total_size, data as data_size, [index] as index_size 
from (select name, 
[rows], 
cast (LEFT(data, LEN(data)-3) as int) data, 
cast (LEFT(index_size, LEN(index_size)-3) as int) [index] 
from @t 
) x 
order by 3 desc, 1 
+0

Aby uzyskać lepszą wydajność, ustaw kursor 'STATIC':' DECLARE tt CURSOR STATIC FOR ... ' –

11

Istnieje sproc wywołania sp_spaceused. Nie wiem, czy to jest to, co @Morawski używane, ale jako przykład na db dev miałem pod ręką:

exec sp_spaceused 'aspnet_users' 

daje

name   rows reserved  data  index_size  unused 
------------- ------- ------------ -------- ------------ ---------- 
aspnet_Users 3  48 KB  8 KB  40 KB   0 KB 
+0

Czy można użyć tej procedury składowania, aby uzyskać przestrzeń używaną przez wszystkie tabele? –

+0

Masz na myśli całość (sumy) lub indywidualnie? –

+0

Indywidualnie. Mam na myśli, używając tej procedury sklepu, aby mieć listę wszystkich tabel, z wielkością i przestrzenią używaną dla każdej tabeli. –

2

Nie jestem pewien skrypt TSQL (jestem pewien, że istnieje), ale można go znaleźć za pośrednictwem interfejsu użytkownika (SSMS) w następujący sposób:

1) R-kliknij tabelę
2) ... Właściwości
3) ... kartę Storage

Stamtąd powie ci zarówno "przestrzeń danych" i "przestrzeń indeksu" - więc jeśli chcesz mieć całkowity ślad, po prostu je dodaj.

EDIT
Rozważmy również przestrzeń zalogować jeśli szukasz całkowitej ślad na stole.

Oto informacje o procedurze zapisanej w odpowiedzi @ jon. Ponadto odwołuje się do widoków systemu, w których można bezpośrednio zapytać o dane dotyczące wykorzystania przestrzeni. http://msdn.microsoft.com/en-us/library/ms188776.aspx

3

Istnieją precyzyjne wzory turystyczne planowanie wydajności dla SQL Server:

1000 kolumn stałych podwójnej długości (która byłaby float(53) Typ SQL, 8 bajtów pamięci) twój wiersz zbliża się do maksymalnego rozmiaru wiersza l imit, ale w rzeczywistości pasuje do strony. 44k wierszy wymaga 44 tys. Stron (ze względu na duży rozmiar wiersza, zmieściłby się tylko jeden wiersz na stronę), czyli na poziomie 8kb na stronie 44000 * 8kb = ~ 344 Mb. Jeśli rozmiar indeksu w klastrze zwiększy się w zależności od rozmiaru klucza, zobacz pierwszy link powyżej.

Ale konstrukcja stołu z 1000 kolumn to ogromny zapach kodu. Twoje pytanie jest bardzo niejasne w odniesieniu do części bazy danych, twoje poprzednie pytanie nigdy nie wspomina o bazie danych i dotyczy tablic pamięci, a po dodaniu tych dwóch pytań po prostu nie ma to większego sensu.

Być może interesuje Cię informacja na temat Sparse Columns, około EAV modeling lub około XML data type.

Powiązane problemy