Простой запрос для генерации метрик базы данных? - PullRequest
1 голос
/ 23 ноября 2010

Предоставляя базу данных (Sybase) со многими таблицами, я хотел бы написать SQL-запрос, который вычислит для каждой таблицы количество строк и количество столбцов.

К сожалению, мой SQL немного ржавый. Я могу сгенерировать имена таблиц:

select name from sysobjects where type = 'U'   

но как связать базы данных, возвращенные в T:

select count(*) from T

выше меня. Возможно ли вообще делать такие вещи?

Ответы [ 2 ]

3 голосов
/ 23 ноября 2010

Я не использую Sybase, но в онлайн-документах указано, что число строк указано в systabstats, а столбцы - в syscolumns.

SELECT sysobjects.name, 
      (SELECT COUNT(*) FROM syscolumns WHERE syscolumns.id = sysobjects.id) AS cols,
       systabstats.rowcnt
    FROM sysobjects
    JOIN systabstats 
    ON (sysobjects.id = systabstats.id AND sysobjects.type = 'U' AND systabstats.indid = 0)
2 голосов
/ 23 ноября 2010

Поскольку Фредт дал ответ, я просто предоставлю некоторую дополнительную информацию.

Встроенная процедура sp_spaceused "tablename" даст вам количество строк для выбранной таблицы, а также подробную информацию о том, сколько места для хранения она использует. Используется без параметра и обеспечивает использование хранилища для текущей базы данных в целом.

Вы можете посмотреть на SQL в различных системных хранимых процедурах, чтобы увидеть, откуда они получают информацию. sp_spaceused и sp_help будут полезны для вас в этом. Они живут в базе данных sybsystemprocs. Только будьте осторожны, чтобы не изменять ни одну из этих процедур.

Существуют различные версии хранимой процедуры sp_rowcount, распространяющейся по Интернету, которые предоставляют то, что вы просите (в любом случае, rowcount), но внутри они эквивалентны утверждению select из fredt. Тот, который я использую, обеспечивает подсчет индекса и схему блокировки таблицы. Я не помню точно, где я взял мой, поэтому не хочу просто распространять его на случай, если я нарушу чьи-то авторские права.

...