Spis treści:

Kategoria:SQL Server


Zliczanie wartości null we wszystkich kolumnach tabeli

Dzisiaj zajmiemy się skryptem bardziej raportowym niż zwykle. Sam z siebie nie naprawia niczego, niczego nie tworzy. Daje nam jednak wiele informacji na temat użycia poszczególnych kolumn tabeli w bazie danych. Informacja taka posłuży nam do lepszego rozplanowania nowej tabeli, nowych indeksów na istniejącej tabeli. W jaki sposób? Oto skrypt:

DECLARE @tab nvarchar(128) = 'MojaTabela'
DECLARE @col nvarchar(128)
DECLARE @q nvarchar(256)
CREATE TABLE #result(
  ColName nvarchar(128),
  Nulls int,
  TotalRecords int
  ) 

DECLARE cur CURSOR FOR
SELECT C.name FROM sys.columns C
JOIN sys.tablesON C.[object_id]=T.[object_id]
WHERE T.name=@tab

OPEN cur
FETCH NEXT FROM cur INTO @col
WHILE @@FETCH_STATUS=0
BEGIN
  SET @q = 'INSERT INTO #result SELECT ''' + @col + ''', SUM((CASE WHEN '
    + @col + ' IS NULL THEN 1 ELSE 0 END )), COUNT(*) FROM ' + @tab
  EXEC sp_sqlexec @q
  FETCH NEXT FROM cur INTO @col
END
CLOSE cur
DEALLOCATE cur
INSERT INTO #result SELECT 'Sumarycznie'SUM(Nulls), SUM(TotalRecords) FROM #result
SELECT ColName, Nulls, TotalRecords-Nulls NotNull, TotalRecords,
CAST(100*(TotalRecords-Nulls)/TotalRecords AS nvarchar)+'%' [FillFactor]
FROM #result ORDER BY Nulls
DROP TABLE #result

Wynikiem działania powyższego skryptu będzie rezultat podobny do zaprezentowanego poniżej:

ColNameNullsNotNullTotalRecordsFillFactor
Kolumna10504916504916100%
Kolumna238799011692650491623%
Kolumna34056459927150491620%
Kolumna44177828713450491617%
Kolumna55047871295049160%
Sumarycznie1716204808376252458032%

W przypadku dużych i starych baz danych można natknąć się na pola, które nie są używane. Jeżeli tabela jest duża, a w pewnych kolumnie nic nie ma, wtedy warto się zastanowić nad tym, czy rzeczywiście ta kolumna jest nam potrzebna. Może jest to jakaś historyczna perełka, dawniej używana, a obecnie zapomniana? Jeżeli grupa kolumn przyjmuje wartości null jednocześnie, warto rozważyć przeniesienie ich do oddzielnej tabeli z relacją jeden do jednego. Takie statystyki często bardzo ładnie pokazują błędy w normalizacji tabel. Bez względu na zastosowanie, mam nadzieję, że skrypt się przyda.

Kategoria:SQL Server

, 2013-12-20

Brak komentarzy - bądź pierwszy

Dodaj komentarz
Wyślij
Ostatnie komentarze
To samo pytanie co wyżej. Mam za zadanie dodać kolumnę do istniejącej tabeli łącząc obie inne kolumny ze sobą, ale nie mam pojęcia jak za to się zabrać
działa :) tylko była literówka :)
Podziękował. Trochę późno, po 8 latach, ale dzięki za testy (rozumiem że dla SQL2012 robione). Tak się właśnie zastanawiałem ile złego czynię stosując czasem __(max).
Super robota, korzystając z innych internetowych kalkulatorow po prostu wątpiłem w ich prawdomówność, w końcu trafiłem tutaj i wynik w końcu jest wiarygodny. 40 km w 2 h 810 kcal, ciekawostka: na fitatu wyliczyło mi 5700 kcal 😊 najlepiej będzie chyba jak kupię zegarek sportowy.
Wielkie dzieki za solidne wyjasnienia tematu.