Существует несколько важных представлений словаря базы данных, которые можно использовать для нахождения детальной информации о любом из объектов базы данных, о которых говорилось в этой главе. Администраторы баз данных также интенсивно используют представления словаря данных, чтобы управлять различными объектами схемы. Здесь приводится краткий список важнейших представлений, часть из которых упоминалась выше. Полные данные о типах информации, которую можно получить от каждого из этих представлений, доступны по команде DESCRIBE (например, DESCRIBE DBA_CATALOG).
В этой статье блога будут описаны некоторые важные представления словаря данных, которые помогут управлять объектами, не хранящими данные (т.е. объектами, которые не относятся к таблицам и индексам). Ниже приведен список важнейших представлений словаря данных для просмотра объектов базы данных.
- DBA_SYNONYMS. Информация о синонимах базы данных.
- DBA_TRIGGERS. Информация о триггерах.
- DBA_SEQUENCES. Информация о созданных пользователем последовательностях.
- DBA_DB_LINKS. Информация о связях базы данных.
Как упоминалось ранее, представление DBA_OBJECTS предоставляет важную информацию обо всех перечисленных объектах, наряду с некоторыми другими типами объектов базы данных. Однако перечисленные представления содержат детальную информацию о каждом объекте, такую как исходный текст триггера, которую вы не получите из представления DBA_OBJECTS.
Управление такими объектами, как таблицы и представления, осуществляется ссылкой на представления словаря данных, наподобие DBA_TABLES и DBA_VIEWS. Существуют также отдельные представления для секционированных таблиц. Давайте рассмотрим ключевые представления словаря данных, относящиеся к таблицам и индексам.
DBA_OBJECTS
Представление DBA_OBJECTS содержит информацию обо всех объектах базы данных, включая таблицы, индексы, пакеты, процедуры, функции, измерения, материализованные представления, планы ресурсов, типы, последовательности, синонимы, триггеры, представления и разделы таблиц (оно же секционирование). Как несложно догадаться, это представления удобно, когда нужно знать общую информацию относительно любого объекта базы данных. В листинге ниже показан запрос, предназначенный для нахождения времени создания и времени последней модификации объекта (LAST_DDL_TIME). Этот тип запроса поможет идентифицировать время модификации определенного объекта, что часто используется в процессе аудита.
SQL> SELECT object_name, 2 object_type, 3 created, 4 last_ddl_time, 5 FROM DBA_OBJECTS 6 WHERE owner ='APPOWNER' 7* AND object_name LIKE 'YTD%'; OBJECT_NAME OBJECT_TYPE CREATED LAST_DDL_TIME ----------------- ----------- ---------- ------------- YTD_ADJ2005050603 TABLE 01/23/2008 01/23/2008 SQL>
DBA_TABLES
Представление DBA_TABLES содержит информацию обо всех реляционных таблицах базы данных. Представление DBA_TABLES — основной справочник для нахождения информации о хранении, количестве строк в таблице, состоянии протоколирования, информации буферного пула и многих других деталях. Ниже приведен простой пример запроса представления DBA_TABLES:
SQL> SELECT tablespace_name,table_name FROM DBA_TABLES; TABLESPACE_NAME TABLE_NAME --------------- ---------------- EXAMPLE DEPARTMENTS EXAMPLE EMPLOYEES_INTERI EXAMPLE EMPLOYEES_NEW EXAMPLE JOBS EXAMPLE JOB_HISTORY EXAMPLE TEST 6 rows selected. SQL>
На заметку! Представление DBA_ALL_TABLES содержит информацию обо всех объектных и реляционных таблицах в базе данных, в то время как представление DBA_TABLES ограничено только реляционными таблицами.
Представление DBA_TABLES служит для нахождения таких вещей, как включено ли сжатие и отслеживание зависимостей на уровне строки, и была ли таблица уничтожена и помещена в корзину (Recycle Bin).
DBA_EXTERNAL_TABLES
Представление DBA_EXTERNAL_TABLES показывает подробности о любой внешней таблице в базе данных, включая их тип доступа, параметры доступа и информацию о каталоге.
DBA_TAB_PARTITIONS
Представление DBA_TAB_PARTITIONS подобно представлению DBA_TABLES, но содержит детальную информацию о разделах таблиц. Благодаря DBA_TAB_PARTITIONS, можно узнать имя раздела, его максимальные значения, информацию о хранении раздела,статистику по разделу, а также прочую информацию, которая доступна в представлении DBA_TABLES. В листинге ниже показан простой запрос, использующий представление DBA_TAB_PARTITIONS.
SQL> SELECT table_name, partition_name, 2 high_value, 3* FROM DBA_TAB_PARTITIONS; TABLE_NAME PARTITION_NAME HIGH_VALUE ------------ -------------- ------------------------------- SALES SALES_Q2_2004 TO_DATE(' 2007-07-01 00:00:00') SALES SALES_Q3_2004 TO_DATE(' 2007-10-01 00:00:00') SALES SALES_Q4_2004 TO_DATE(' 2008-01-01 00:00:00') SALES SALES_Q1_2005 TO_DATE(' 2008-04-01 00:00:00') SALES SALES_Q2_2005 TO_DATE(' 2008-07-01 00:00:00') SALES SALES_Q3_2005 TO_DATE(' 2008-10-01 00:00:00') SALES SALES_Q4_2005 TO_DATE(' 2009-01-01 00:00:00') EMPLOYEES EMPLOYEES1 100 EMPLOYEES EMPLOYEES2 300 SQL>
DBA_PART_TABLES
Представление DBA_PART_TABLES содержит информацию о типе схемы раздела и прочих параметрах хранения разделов и подразделов. Узнать тип каждого раздела каждой секционированной таблицы можно с помощью следующего запроса:
SQL> SELECT table_name, partitioning_type, 2 def_tablespace_name 3 FROM DBA_PART_TABLES; TABLE_NAME PARTITION_TYPE DEF_TABLESPACE_NAME ------------------ --------------- ------------------- EMPLOYEES RANGE EXAMPLE EMPLOYEES_INTERIM RANGE EXAMPLE COSTS RANGE EXAMPLE SALES RANGE EXAMPLE SQL>
DBA_TAB_MODIFICATIONS
Представление DBA_TAB_MODIFICATIONS показывает все изменения DML в таблице,произошедшие с момента последнего сбора статистики по этой таблице. Вот запрос к этому представлению:
SQL> SELECT table_name, inserts, updates, deletes FROM DBA_TAB_MODIFICATIONS; TABLE_NAME INSERTS UPDATES DELETES -------------------------- ------- ------- ------- WRH$ACTIVE_SESSION_HISTORY 1233 0 0 WRH$SERVICE_STAT 5376 0 0 WRH$SERVICE_WAIT_CLASS 1050 0 0 . . . SQL>
База данных не обновляет представление DBA_TAB_MODIFICATIONS в реальном времени. Следовательно, вы можете и не увидеть изменений в различных таблицах, немедленно отраженных в этом представлении.
DBA_TAB_COLUMNS
Предположим, вы нужно узнать среднюю длину каждой строки таблицы или значение по умолчанию каждого столбца (если таковое есть). Представление DBA_TAB_COLUMNS — отличный способ быстро получить всю детальную информацию о столбцах таблиц схемы, как показано в листинге ниже.
SQL> SELECT column_name, 2 avg_col_len, 3 data_type, 4 data_length, 5 nullable, 6 FROM dba_tab_columns 7* WHERE owner='OE'; COLUMN_NAME AVG_COL_LEN DATA_TYPE DATA_LENGTH NULL ---------------------- ----------- --------- ------------- ---- CUSTOMER_ID 4 NUMBER 22 N CUST_FIRST_NAME 7 VARCHAR2 20 N CUST_LAST_NAME 8 VARCHAR2 20 N TRANSLATED_DESCRIPTION 245 NVARCHAR2 4000 N PRODUCT_DESCRIPTION 123 VARCHAR2 2000 Y WARRANTY_PERIOD 5 INTERVAL YEA 5 Y SQL>
DBA_VIEWS
Как известно, представления — это результаты запросов к некоторым таблицам базы данных. Представление словаря данных DBA_VIEWS позволяет увидеть SQL-запросы, лежащие в основе представлений. В листинге ниже показано, как получить текст представления OS_CUSTOMERS, принадлежащего пользователю oe.
Совет. Чтобы обеспечить полное отображение текста при использовании представления DBA_VIEWS, установите большое значение переменной long (например, SET LONG 2000). В противном случае вы увидите лишь несколько первых строк определения представления.
SQL> SET LONG 2000 SQL> SELECT text 2 FROM DBA_VIEWS 3 WHERE view_name ='OC_CUSTOMERS' 4* AND owner = 'OE'; TEXT -------------------------------------------------- SELECT c.customer_id, c.cust_first_name, c.cust_last_name, c.cust_address, c.phone_numbers,c.nls_languag e,c.nls_territory,c.credit_limit, c.cust_email, CAST(MULTISET(SELECT o.order_id, o.order_mode, MAKE_REF( oc_customers,o.customer_id), o.order_status,o.order_t otal,o.sales_rep_id, CAST(MULTISET(SELECT l.order_id,l.line_item_id, l.unit_price,l.quantity, MAKE_REF(oc_product_information, l.product_id) FROM order_items l WHERE o.order_id = l.order_id) AS order_item_list_typ) FROM orders o WHERE c.customer_id = o.customer_id) AS order_list_typ) FROM customers c SQL>
DBA_MVIEWS
Представление словаря DBA_MVIEWS сообщает все о материализованных представлениях в базе данных, в том числе информацию, включено ли для них средство переписывания запросов. В листинге ниже демонстрируется использования этого представления.
SQL> SELECT 2 mview_name, 3 query, 4 updatable, 5 rewrite_enabled, /* включено ли средство переписывания запросов */ 6 refresh_mode, /* demand, commit или never */ 7 refresh_method /* complete, force, fast или never */ 8* FROM dba_mviews;
MVIEW_NAME QUERY UPD REW REFR REFRESH_ME ---------------- ---------------------------- ---- ---- --------------- MONTH_SALES_MV SELECT t.calendar_month_desc N Y DEMAND FORCE PCAT_SALES_MV SELECT t.week_ending_day N Y DEMAND COMPLETE SQL>
DBA_INDEXES
Представление словаря DBA_INDEXES служит для того, чтобы узнать все необходимое об индексах в базе данных, включая имя индекса, его тип, таблицу и табличное пространство, к которому он относится. Определенные столбцы, наподобие BLEVEL (сообщает уровень B-дерева индекса) и DISTINCT_KEYS (количество разных значений ключа индекс), наполняются, только если собрана статистика по индексу с использованием пакета DBMS_STATS.
DBA_IND_COLUMNS
Представления DBA_IND_COLUMNS по структуре подобно представлению DBA_CONS_COLUMNS и содержит информацию обо всех проиндексированных столбцах каждой таблицы. Эта информация важна при настройке производительности, когда вы замечаете,что запрос использует индекс, но вы не знаете точно, на каких столбцах этот индекс определен. Запрос, приведенный в листинге ниже, показывает, что таблица имеет индексы, определенные на неверных столбцах.
SQL> SELECT index_name, 2 table_name, 3 column_name, 4 column_position 5 FROM DBA_IND_COLUMNS 6* WHERE table_owner='OE'; INDEX_NAME TABLE_NAME COLUMN_NAME COLUMN_POSITION ----------------------- ----------- ---------------- --------------- CUST_ACCOUNT_MANAGER_IX CUSTOMERS ACCOUNT_MGR_ID 1 CUST_LNAME_IX CUSTOMERS CUST_LAST_NAME 1 CUST_EMAIL_IX CUSTOMERS CUST_EMAIL 1 INVENTORY_PK INVENTORIES PRODUCT_ID 1 INVENTORY_PK INVENTORIES WAREHOUSE_ID 2 INV_PRODUCT_IX INVENTORIES PRODUCT_ID 1 ORDER_PK ORDERS ORDER_ID 1 ORD_SALES_REP_IX ORDERS SALES_REP_ID 1 ORD_CUSTOMER_IX ORDERS CUSTOMER_ID 1 SQL>
Совет. Взглянув на столбец INDEX_NAME, можно легко идентифицировать составные ключи. Если одно и то же вхождение INDEX_NAME появляется больше одного раза, значит, это составной ключ; и столбцы, являющиеся его частью, показаны в столбце COLUMN_NAME. Например,INVENTORY_PK — первичный ключ таблицы INVENTORIES, определенный на двух столбцах:PRODUCT_ID и WAREHOUSE_ID. Порядок столбцов в определении составного ключа можно узнать с помощью столбца COLUMN_POSITION.
INDEX_STATS
Представление INDEX_STATS полезно для того, чтобы узнать, насколько эффективно индекс использует свое пространство. Крупные индексы имеют тенденцию со временем становиться несбалансированными, если происходит много удалений данных таблицы (а, следовательно, и индекса). Ваша цель — не упускать из виду эти крупные индексы,чтобы сохранять их сбалансированными.
Обратите внимание, что представление INDEX_STATS наполняется, только когда таблица подвергается анализу с помощью команды ANALYZE, как показано ниже:
SQL> ANALYZE index hr.emp_name_ix VALIDATE STRUCTURE; Index analyzed.
Запрос из листинга ниже, использующий представление INDEX_STATS, помогает определить необходимость в перестройке индекса. Чтобы определить, следует ли перестраивать индекс, в запросе необходимо сосредоточиться на перечисленных ниже столбцах представления INDEX_STATS.
- HEIGHT. Этот столбец ссылается на высоту B-дерева индекса и обычно имеет значение уровня 1, 2 или 3. Если массивные вставки данных выталкивают индекс на высоту уровня 4, самое время перестроить индекс, уменьшив высоту B-дерева.
- DEL_LF_ROWS. Это количество листовых узлов, удаленных из-за удаления строк.Oracle не перестраивает индекс автоматически и, следовательно, слишком много удалений листовых строк могут привести к несбалансированному B-дереву.
- BLK_GETS_PER_ACCESS. Столбец BLK_GETS_PER_ACCESS позволяет увидеть, сколько логических операций ввода-вывода требуется для извлечения данных индекса.Если здесь находится двузначное число, значит, наступило время для перестройки индекса.
SQL> SELECT height, /* Высота B-дерева */ 2 blocks, /* Блоки в сегменте индекса */ 3 name, /* Имя индекса */ 4 lf_rows, /* Количество листовых строк в индексе */ 5 lf_blks, /* Количество листовых блоков в индексе */ 6 del_lf_rows, /* Количество удаленных листовых строк в индексе */ 7 rows_per_key /* Среднее количество строк на каждый отдельный ключ */ 8 blk_gets_per_access /* Согласованные чтения блоков (gets) */ 8 FROM INDEX_STATS 9* WHERE name='EMP_NAME_IX'; HEIGHT BLOCK LF_ROWS LF_BLKS DEL_LF_ROWS ROWS_PER_KEY BLK_GETS ------ ----------- ------- -------- ----------- ------------ --------- 16 EMP_NAME_IX 107 1 0 1 1 SQL>