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
Dzieki za rozjasnienie zagadnienia upsert. wlasnie sie ucze programowania :).
Co się stanie gdy spróbuję wyszukać:
SELECT * FROM NV_Airport WHERE Code='SVO'
SELECT * FROM V_Airport WHERE Code=N'SVO'
(odwrotnie są te N-ki)
Będzie konwersja czy nie znajdzie żadnego rekordu?