Доступные версии документации

Код завершения 806 «Список номеров записей переполнен (внутренняя ошибка ядра)» при работе с запросом на соединение больших таблиц

Одна из возможных причин – СУБД ЛИНТЕР обрабатывает отдельно малоселективный предикат типа T1.X = T2.Y (когда число записей в результате соединения пропорционально не числу записей в одной из таблиц T1 и T2, а произведению чисел записей в этих таблицах).

Возможный способ решения этой проблемы – создание составных индексов, которые включают столбцы T1.X и T2.Y вместе с другим столбцами, соединение по которым выполняется в запросе, и они более селективны. Например, если есть еще условие T1.A = T2.B и составные индексы на таблицу T1 по столбцам A и X и на таблицу T1 по столбцам B и Y, то предикаты T1.X = T2.Y и T1.A = T2.B могут эффективно вычисляться совместно.

Если же таких индексов нет, или они не помогают решить проблему, может быть полезным поставить для предиката T1.X = T2.Y хинт LAST, чтобы этот предикат вычислялся последним после обработки всех остальных более селективных предикатов:

...
T1.X = T2.Y /* +LAST */
...

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

Проверить превышение допустимого лимита количества записей в ответе. Значение зависит от количества таблиц, участвующих в выборке – чем больше участвующих таблиц, тем лимит меньше. ~500 миллионов записей для двух таблиц, ~250 миллионов для 4 таблиц, ~125 миллионов для 8 таблиц и т.д.

Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter