Как сравнить индексы таблиц из двух разных баз данных в Oracle?
Язык структурированных запросов, поддерживаемый RDBMS (системами управления реляционными базами данных), такими как Oracle, Mysql, PostgreSQL и SQL Server. Все системы реляционных баз данных поддерживают такие объекты, как базы данных, таблицы, схемы, индексы, представления, функции, процедуры и многое другое.
Система СУБД работает лучше всего, когда схема находится в режиме записи. Чтобы эти системы хорошо работали со схемой при чтении, у нас есть индексы, которые помогают повысить производительность чтения или поиска данных.
Для сравнения индексов таблиц из двух разных баз данных необходимо сначала сравнить их данные и структуру схемы. В иерархии систем управления базами данных у нас есть схема, базы данных, таблицы, столбцы, а затем индексы.
Рассмотрим две разные базы данных «Department_HR» и «Department_CR».
Шаг 1: Создание пользователей для баз данных.
create user source PASSWORD "s"; ALTER USER source WITH SUPERUSER;
create user target PASSWORD "t";
Шаг 2: Создание базы данных «Department_HR» и «Department_CR»
create database Department_HR OWNER source;
create database Department_CR OWNER target;
Шаг 3: Создайте таблицу «Сотрудники» в базе данных «Department_HR» и «Department_CR».
Create table Department_HR.Employees ( EMPLOYEE_ID int, FIRST_NAME varchar(120), LAST_NAME varchar(120), EMAIL varchar(120), HIRE_DATE date, JOB_ID varchar(120), SALARY float, COMMISSION_PCT float, MANAGER_ID int, DEPARTMENT_ID int );
Create table Department_CR.Employees ( EMPLOYEE_ID int, FIRST_NAME varchar(120), LAST_NAME varchar(120), EMAIL varchar(120), HIRE_DATE date, JOB_ID varchar(120), SALARY float, COMMISSION_PCT float, MANAGER_ID int, DEPARTMENT_ID int );
Шаг 4. Вставьте данные в таблицы отдел_HR.employees и отдел_CR.employees
insert into employees values(100,"Steven", "King","SKING","17-Jun-03","AD_PRES",24000, null ,90); insert into employees values(101,"Neena"," Kochhar","NKOCHHAR","21-Sept-05","AD_VP",17000,100,90); insert into employees values(102,"Lex","DeHaan", "LDEHAAN","13-Jan-01","AD_VP",17000,100,90); insert into employees values(103,"Alexander", "Hunold","AHUNOLD","03-Jan-06","IT_PROG",9000,102,60); insert into employees values(104,"Bruce"," Ernst","BERNST","21-May-07","IT_PROG",6000,103,60); insert into employees values(105,"David", "Austin","DAUSTIN","25-Jun-05","IT_PROG",4800,103,60); insert into employees values(106,"Valli", "Pataballa","VPATABAL","05-Feb-06","IT_PROG",4800,103,60); insert into employees values(107,"Diana", "Lorentz","DLORENTZ","07-Feb-07","IT_PROG",4200,103,60); insert into employees values(108,"Nancy", "Greenberg","NGREENBE","17-Aug-02","FI_MGR",12008,101,100);
Шаг 5: Выберите вставленные данные в таблицы отдел_HR.employees и отдел_CR.employees
select * from department_HR.employees;
select * from department_CR.employees;
Шаг 6: Сравните индексы из обеих баз данных, у нас должны быть индексы в столбце таблицы.
create index indx_dept_emp_id on department_HR.employees(employee_id); create index indx_dept_manager_id on department_HR.employees(manager_id);
create index indx_dept_emp_id on department_CR.employees(employee_id); create index indx_dept_manager_id on department_CR.employees(manager_id);
Шаг 7. Создайте связь между двумя разными базами данных для сравнения индексов.
Войдите в базу данных Исходная база данных Department_HR и создайте ССЫЛКУ на БД.
- Создайте расширение для установления соединения между двумя базами данных
CREATE EXTENSION dblink;
- Создайте сервер для подключения к целевой базе данных.
CREATE SERVER server_Department_CR_remote FOREIGN DATA WRAPPER dblink_fdw OPTIONS (host "localhost", dbname "Department_CR", port "1521");
- Создайте сопоставление пользователей из исходной базы данных для целевой базы данных.
CREATE USER MAPPING FOR Department_HR SERVER server_Department_CR_remote OPTIONS (user "target",password "t");
- Предоставьте выборочный доступ к исходной базе данных на удаленном сервере.
GRANT USAGE ON FOREIGN SERVER server_Department_CR_remote TO source;
- Функция dblink_connect для установления соединения от источника к целевой БД.
SELECT dblink_connect("myconn", "dbname=department_cr port=1521 host=localhost user=target password=t");
Шаг 8: Запрос для сравнения индексов.
# Login to source database
select distinct i1.index_name from user_ind_columns i1 where table_name="Department_HR" and not exists (select * from user_ind_columns i2 where i2.table_name = "Department_CR" and i1.column_name = i2.column_name and i1.column_position = i2.column_position);
Выход:
Index_name ---------- indx_dept_emp_id indx_dept_manager_id