У меня есть одна большая таблица A, в которой есть PK (C1, C2, C3) и многие другие столбцы, чтобы ускорить выбор, с помощью PK (C1, C2) была создана меньшая таблица B. Таким образом, мы можем сделать выбор, объединив две таблицы, чтобы найти строку в A.

Но проблема в том, что может случиться так, что если данные в B повреждены, в результате чего совместный выбор ничего не возвращает, но у нас все еще есть строка в A.

Я что-то делаю не так с этим дизайном и как я могу обеспечить согласованность данных в этих двух таблицах?

Большое спасибо.

0
Bing 3 Дек 2019 в 13:54
1
Не могли бы вы опубликовать пример отношений? Это звучит так, как будто все данные в таблице B существуют в таблице A, и вы просто используете это для поиска, это правильно? Как заполняется таблица B?
 – 
Neville Kuyt
3 Дек 2019 в 14:39

2 ответа

Стандартный способ - если эти таблицы находятся в отношении "главный-подробный" - заключается в создании ограничения внешнего ключа , которое предотвратит удаление мастера, если подробности существуют.

Если вы можете исправить это сейчас, сделайте это - затем создайте ограничение.

Если вы не можете, создайте ограничение внешнего ключа с помощью параметра INITIALLY DEFERRED DEFERRABLE, чтобы текущие значения не проверялись, но будущий DML проверялся.

Наконец, чтобы получить данные, хотя определенные строки больше не существуют, используйте внешнее соединение .

3
Littlefoot 3 Дек 2019 в 14:09
Да, эти две таблицы связаны отношениями "главный-подробный". Я попробую это решение, большое спасибо!
 – 
Bing
3 Дек 2019 в 15:31

«Я что-то не так делаю с этим дизайном?»

Что ж, трудно быть уверенным, не имея более подробной информации о вашем сценарии, но, вероятно, вам просто нужен неуникальный индекс для A(C1, C2).

Хотя я хотел бы увидеть некоторые тесты, которые доказывают, что сканирование диапазона индекса для вашего индекса первичного ключа не подходило для этой работы. Тем более, что кажется вероятным, что соединение в таблице B использует этот путь доступа.

Настройка производительности базы данных Oracle - это вопрос понимания и совмещения многих переменных. Это не просто случай «заткки по другому индексу». Нам нужно понимать, что на самом деле делает база данных и почему оптимизатор сделал этот выбор. Итак, прочтите этот пост о задании вопросов по настройке Oracle, который даст вам некоторое представление о том, как подойти к оптимизации запросов.

1
APC 3 Дек 2019 в 15:21