Как определить неиспользуемые / избыточные столбцы по списку таблиц? - PullRequest
2 голосов
/ 07 января 2009

[Это в базе данных iSeries / DB2, если это имеет какое-либо значение]

Я хочу написать процедуру для идентификации столбцов, которые оставлены пустыми или нулевыми (учитывая список таблиц).

Если я могу извлечь определения таблиц и столбцов из центральных системных таблиц, как мне проверить вышеуказанное условие? Мое первое предположение заключается в том, что для каждого столбца динамически генерируется выражение, например:

select count(*) from my_table where my_column != 0

и проверить, возвращает ли это ноль строк, но есть ли лучший / более быстрый / стандартный способ сделать это?

NB. Это просто для обработки простых символов, целых / десятичных полей, ничего сложного!

Ответы [ 3 ]

3 голосов
/ 17 января 2009

Да, обычно я бы делал что-то подобное в SQL Server:

SELECT
REPLACE(REPLACE(REPLACE(
'
    SELECT COUNT(*) AS [COUNT NON-EMPTY IN {TABLE_NAME}.{COLUMN_NAME}]
    FROM [{TABLE_SCHEMA}].[{TABLE_NAME}]
    WHERE [{COLUMN_NAME}] IS NOT NULL
        OR [{COLUMN_NAME}] <> 0
'
, '{TABLE_SCHEMA}', c.TABLE_SCHEMA)
, '{TABLE_NAME}', c.TABLE_NAME)
, '{COLUMN_NAME}', c.COLUMN_NAME) AS [SQL]
FROM INFORMATION_SCHEMA.COLUMNS c
INNER JOIN INFORMATION_SCHEMA.TABLES t
    ON t.TABLE_TYPE = 'BASE TABLE'
    AND c.TABLE_CATALOG = t.TABLE_CATALOG
    AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
    AND c.TABLE_NAME = t.TABLE_NAME
    AND c.DATA_TYPE = 'int'

Вы можете стать намного интереснее, выполнив UNIONs всего запроса и проверив IS_NULLABLE для каждого столбца, и, очевидно, у вас могут быть разные требования для разных типов данных, а также пропущенные столбцы идентификаторов и т. Д.

3 голосов
/ 16 февраля 2009

Чтобы проверить столбцы, которые содержат только NULL в DB2:

  1. Выполнить RUNSTATS в вашей базе данных (http://www.ibm.com/developerworks/data/library/techarticle/dm-0412pay/)
  2. Проверьте статистику базы данных, запросив SYSSTAT.TABLES и SYSSTAT.COLUMNS. Сравнение SYSSTAT.TABLES.CARD и SYSSTAT.COLUMNS.NUMNULLS покажет вам, что вам нужно. Примером может быть:

 select t.tabschema, t.tabname, c.colname 
 from sysstat.tables t, sysstat.columns c 
 where ((t.tabschema = 'MYSCHEMA1' and t.tabname='MYTABLE1') or 
        (t.tabschema = 'MYSCHEMA2' and t.tabname='MYTABLE2') or 
        (...)) and 
      t.tabschema = c.tabschema and t.tabname = c.tabname and
      t.card = c.numnulls

Подробнее о статистике системы, например здесь: http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0001070.htm и http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0001073.htm

Точно так же вы можете использовать SYSSTAT.COLUMNS.AVGCOLLEN для проверки пустых столбцов (просто это не работает для больших объектов).

РЕДАКТИРОВАТЬ: И, чтобы проверить столбцы, которые содержат только нули, попробуйте сравнить HIGH2KEY и LOW2KEY в SYSSTAT.COLUMNS.

0 голосов
/ 08 января 2009

Я предполагаю, что вы хотите знать, есть ли какие-либо значения во всех строках данного столбца. Если в вашем столбце могут быть «пробелы», вам, вероятно, потребуется добавить в предложение WHERE оператор OR NOT NULL, чтобы получить правильный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...