Простой запрос для создания метрик базы данных?

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

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

select name from sysobjects where type = 'U'   

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

select count(*) from T

вне меня. Возможно ли вообще сделать что-то подобное?


person CBFraser    schedule 23.11.2010    source источник


Ответы (2)


Я не использую 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)
person fredt    schedule 23.11.2010
comment
Учитывая, что у SQL Server и Sybase одинаковая кровь, это должно работать нормально. - person ; 23.11.2010

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

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

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

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

person AdamH    schedule 23.11.2010
comment
Я не знал, что могу заглянуть в внутренности системных процессов, таких как sp_spaceused и тому подобное. Спасибо за совет. - person CBFraser; 23.11.2010