Полезные запросы к системным таблицам Firebird

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(См. также)
Строка 1: Строка 1:
 
 
=== Табліцы БД ===
 
=== Табліцы БД ===
  
Строка 241: Строка 240:
 
where
 
where
 
   i.rdb$relation_name = :RN
 
   i.rdb$relation_name = :RN
 +
</syntaxhighlight>
 +
 +
 +
=== Список таблиц с BLOB полями. Их размер, количество записей, средний размер записи ===
 +
 +
 +
<syntaxhighlight lang="SQL">
 +
 +
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
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
  

Версия 13:57, 3 ноября 2011

Содержание

Табліцы БД

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

См. также

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты