Как сравнить индексы таблиц из двух разных баз данных в Oracle?

Опубликовано: 5 Января, 2023

Язык структурированных запросов, поддерживаемый 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