Oracle reference partition

Nordall
Дата: 02.10.2015 10:23:23
Добрый день!
Можете подсказать в чем может быть проблема-
есть родительская таблица AAA секционированная по
1.pk ключу(id-number)- hash
2. subpartition поле (dt - date) - intertval
Есть дочерняя таблица DDD ссылающаяся на поле id таблицы AAA(FK)
и по этому reference секционированная. FK - not defferable
Так вот при загрузке в эти две таблицы данных через imdp все загрузилось без ошибок
и FK enabled.
Когда начинаю писать запросы, то нахожу записи, где есть несоответствие по FK - есть записи в DDD
которым нет соответствия в AAA по этому FK.

Версия бд 12.1.0.2. OC - linux
Спасибо!
Павел Воронцов
Дата: 02.10.2015 11:48:39
Nordall,

А заливали как? Ошибки во время импорта были?
Nordall
Дата: 02.10.2015 12:09:33
Павел Воронцов,
Залили без ошибок.Лог еще раз перепроверил.
Ситуация очень настораживает -в базе при включенном foreign key возможны такие
коллизии.
Еще из моих наблюдений
Если писать запрос типа select * from ddd where ddd.p_id not in (select aaa.id from aaa) то 0 строк.
Но запрос
select * from ddd left join aaa on (ddd.p_id=aaa.id) where aaa.id is null возвращает строки.
Поля ddd.p_id и aaa.id is not null.
Павел Воронцов
Дата: 02.10.2015 12:15:41
Nordall,

попробуйте те же данные залить в менее навороченную структуру - без партиций и проверьте. Ну или индексы пересоздайте.
Nordall
Дата: 02.10.2015 12:35:57
Павел Воронцов,
Залили без ошибок.Лог еще раз перепроверил.
Ситуация очень настораживает -в базе при включенном foreign key возможны такие
коллизии.
Еще из моих наблюдений
Если писать запрос типа select * from ddd where ddd.p_id not in (select aaa.id from aaa) то 0 строк.
Но запрос
select * from ddd left join aaa on (ddd.p_id=aaa.id) where aaa.id is null возвращает строки.
Поля ddd.p_id и aaa.id is not null.
Павел Воронцов
Дата: 02.10.2015 12:41:02
Nordall,

я еще и не то видел. Индексы какие? Какие планы у ваших запросов?
Nordall
Дата: 02.10.2015 12:41:55
Павел Воронцов,
Так на это баг/фичу и наткнулся. Создавал рядом лежащие таблички с менее навороченным секционированием - полезли ошибки.
Пошел в исходные таблы и очень удивился.
Nordall
Дата: 02.10.2015 12:58:04
Теперь понял почему запросы выдают разные результаты
В плане
select * from ddd where ddd.p_id not in (select aaa.id from aaa) вообще нет обращения к aaa.
В это же как раз и перфоманс reference partition.

Но как же FK?
Он то должен работать на должном уровне!!!
Perl'ун
Дата: 02.10.2015 13:11:37
Nordall
Но как же FK?
Он то должен работать на должном уровне!!!


Проверка FK происходит в процессе изменения данных или в процессе создания FK. Если FK создан без проверки или как то криво, то существующие данные могут его нарушать. Если по внешнему ключу создан индекс, то FK для проверки использует этот индекс, а не таблицу.

Похоже, у вас индекс по aaa.id поломанный.

>>> Запрос типа select * from ddd where ddd.p_id not in (select aaa.id from aaa) то 0 строк.
>>> Но запрос
>>> select * from ddd left join aaa on (ddd.p_id=aaa.id) where aaa.id is null возвращает строки.
>>> Поля ddd.p_id и aaa.id is not null.

В первом запросе используется только индекс по aaa.id , потому как фактически написан select ddd.* .
Во втором запросе используется таблица aaa, потому как фактически написан select ddd.*, aaa.*.
Вот и вылезает несоответствие между индексом и таблицей.
Короче, копайте индекс по aaa.id. А клюки FK это следствие.
Nordall
Дата: 02.10.2015 13:48:25
Perl'ун,
>>>Короче, копайте индекс по aaa.id. А клюки FK это следствие.
Перестроил индекс. Ошибок не возникло.