Полезные запросы к системным таблицам Firebird
Содержание |
Табліцы БД
RDB$RELATIONS (табліцы)
Выбраць назвы ўсіх табліц БД (яны захоўваюцца ў табліцы RDB$RELATIONS)
select * from rdb$relations
Падлічыць колькасьць табліц у БД
select count(*) from rdb$relations
Выбраць толькі табліцы структуры БД (з прэфіксам RDB)
select * from rdb$relations where rdb$relation_name like '%RDB%'
Падлічыць колькасьць табліц структуры БД
select count(*) from rdb$relations where rdb$relation_name like '%RDB%'
Выбраць толькі табліцы БД, зьвязаныя са складам (з прэфіксам INV)
select * from rdb$relations where rdb$relation_name like '%INV%'
Палі табліц
RDB$RELATION_FIELDS (палі)
Выбраць усе назвы палёў усіх табліц БД (яны захоўваюцца ў табліцы RDB$RELATION_FIELDS)
select * from rdb$relation_fields
Падлічыць колькі палёў уваходзіць у кожную табліцу (групаваць па полю імені табліцы)
select rdb$relation_name, count(rdb$field_name) as kolk_palej from rdb$relation_fields group by rdb$relation_name
Выбраць назвы палёў, якія ўваходзяць у табліцу GD_CONTACT
select f.* from rdb$relation_fields f join rdb$relations r on r.rdb$relation_name = f.rdb$relation_name where r.rdb$relation_name = 'GD_CONTACT'
альбо
select * from rdb$relation_fields where rdb$relation_name = 'GD_CONTACT'
Выбраць назвы табліц, якія маюць дрэвавідную структуру
select r.rdb$relation_name from rdb$relation_fields r where r.rdb$field_name = 'LB'
Список полей с указанием таблиц, на которые ссылаются поля
SELECT
rf.rdb$field_name AS Field_Name,
rc2.rdb$relation_name AS References_Table,
s2.rdb$field_name AS References_Field,
rf.rdb$field_position
FROM
rdb$relation_fields rf
JOIN rdb$relation_constraints rc ON
rc.rdb$relation_name = rf.rdb$relation_name
AND rc.rdb$constraint_type = 'FOREIGN KEY'
JOIN rdb$index_segments s ON
s.rdb$index_name = rc.rdb$index_name
AND s.rdb$field_name = rf.rdb$field_name
JOIN rdb$ref_constraints rfc ON
rfc.rdb$constraint_name = rc.rdb$constraint_name
JOIN rdb$relation_constraints rc2 ON
rc2.rdb$constraint_name = rfc.rdb$const_name_uq
JOIN rdb$index_segments s2 ON
s2.rdb$index_name = rc2.rdb$index_name
WHERE
rf.rdb$relation_name = :RN
UNION
SELECT
rf.rdb$field_name AS Field_Name,
CAST(' ' AS CHAR(31)) AS References_Table,
CAST(' ' AS CHAR(31)) AS References_Field,
rf.rdb$field_position
FROM
rdb$relation_fields rf
WHERE
rf.rdb$relation_name = :RN
AND NOT rf.rdb$field_name IN (
SELECT s.rdb$field_name
FROM
rdb$index_segments s
JOIN rdb$relation_constraints rc ON
rc.rdb$index_name = s.rdb$index_name
AND rc.rdb$constraint_type = 'FOREIGN KEY'
AND rc.rdb$relation_name = :RN
)
ORDER BY
4
Дамены
RDB$FIELDS (дамены)
Выбраць усе дамены БД (яны захоўваюцца ў табліцы RDB$FIELDS)
select * from rdb$fields
Выбраць імёны палёў, якія маюць тып (дамен) ня NULL
select f.rdb$field_name, f.rdb$relation_name
from rdb$relation_fields f
join rdb$fields d
on d.rdb$field_name = f.rdb$field_source
where d.rdb$null_flag = 1
Абмежавальнікі
RDB$RELATION_CONSTRAINTS (абмежавальнікі: першасныя і вонкавыя ключы, NOT NULL, інш.)
Выбраць усе абмежавальнікі ўсіх табліц БД
select * from rdb$relation_constraints
Сьпіс табліц і палёў па якім існуюць два ці болей аднолькавыя зьнешнія спасылкі.
SELECT rf.rdb$relation_name, rf.rdb$field_name, LIST(TRIM(rc.rdb$constraint_name)), COUNT(*) FROM rdb$indices i JOIN rdb$index_segments iseg ON iseg.rdb$index_name = i.rdb$index_name JOIN rdb$relation_constraints rc ON rc.rdb$index_name = i.rdb$index_name AND rc.rdb$constraint_type = 'FOREIGN KEY' JOIN rdb$relation_fields rf ON rf.rdb$relation_name = i.rdb$relation_name AND iseg.rdb$field_name = rf.rdb$field_name GROUP BY 1, 2 HAVING COUNT(*) > 1
Індэксы
RDB$INDICES (індэксы)
Выбраць усе індэксы ўсіх табліц БД
select * from rdb$indices
Выбраць усе табліцы, якія спасылаюцца на табліцу GD_DOCUMENT
select rdb$relation_name from rdb$indices where rdb$foreign_key = 'GD_PK_DOCUMENT'
Выбраць усе табліцы, якія спасылаюцца на табліцу GD_DOCUMENT, выключаючы дубліруючыя запісы
select distinct rdb$relation_name from rdb$indices where rdb$foreign_key = 'GD_PK_DOCUMENT'
RDB$INDEX_SEGMENTS (складнікі індэксаў, зь якіх палёў складаюцца індэксы)
Выбраць складнікі (палі) ўсіх індэксаў
select * from rdb$index_segments
select i.rdb$relation_name, s.rdb$field_name
from rdb$indices i
join rdb$index_segments s
on i.rdb$index_name = s.rdb$index_name
Палі табліц, якія зьвязаныя з табліцай GD_DOCUMENT
select i.rdb$relation_name, s.rdb$field_name
from rdb$indices i
join rdb$index_segments s
on i.rdb$index_name = s.rdb$index_name
and i.rdb$foreign_key = 'GD_PK_DOCUMENT'
Залежнасьці
RDB$DEPENDENCIES (залежнасьці паміж табліцамі)
Выбраць усе залежнасьці паміж табліцамі БД
select * from rdb$dependencies
Выбраць усе дамены Гедыміна
select * from AT_FIELDS
Список всех полей и таблиц, которые ссылаются на заданную таблицу
SELECT 'Поле', iseg.rdb$field_name, 'таблицы', ifk.rdb$relation_name, 'ссылается на поле', ipkseg.rdb$field_name, 'таблицы', i.rdb$relation_name FROM rdb$relation_constraints cs JOIN rdb$ref_constraints rc ON rc.rdb$constraint_name = cs.rdb$constraint_name JOIN rdb$relation_constraints ps ON ps.rdb$constraint_name = rc.rdb$const_name_uq JOIN rdb$indices i ON i.rdb$index_name = ps.rdb$index_name JOIN rdb$index_segments ipkseg ON i.rdb$index_name = ipkseg.rdb$index_name JOIN rdb$indices ifk ON ifk.rdb$index_name = cs.rdb$index_name JOIN rdb$index_segments iseg ON iseg.rdb$index_name = ifk.rdb$index_name WHERE i.rdb$relation_name = :RN
Список таблиц с BLOB полями. Их размер, количество записей, средний размер записи
EXECUTE block RETURNS ( TABLE_NAME CHAR(31), FIELD_NAME CHAR(31), FIELD_SIZE BIGINT, RECORD_COUNT BIGINT, AVG_SIZE BIGINT, SQL VARCHAR(200)) AS BEGIN FOR SELECT T.RDB$RELATION_NAME, R.RDB$FIELD_NAME FROM RDB$RELATIONS T JOIN RDB$RELATION_FIELDS R ON R.RDB$RELATION_NAME=T.RDB$RELATION_NAME JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE WHERE F.RDB$FIELD_TYPE=261 AND T.RDB$RELATION_TYPE=0 ORDER BY 1, 2 INTO TABLE_NAME, FIELD_NAME do BEGIN SQL='select sum(OCTET_LENGTH(' || TRIM(FIELD_NAME) || ')), count(' || TRIM(FIELD_NAME) || ') from ' || TRIM(TABLE_NAME); EXECUTE statement SQL INTO FIELD_SIZE, RECORD_COUNT; AVG_SIZE=FIELD_SIZE/(CASE WHEN RECORD_COUNT>0 THEN RECORD_COUNT ELSE 1 END); suspend; END END