найдите лучший способ обхода таблицы oracle

#oracle

Вопрос:

У меня есть таблица оракула. DDL таблицы (не имеет первичного ключа)

 create table CLIENT_ACCOUNT
(
    CLIENT_ID VARCHAR2(18) default ' ' not null,
    ACCOUNT_ID VARCHAR2(18) default ' ' not null,
    ......
)

create unique index UK_ACCOUNT
    on CLIENT_ACCOUNT (CLIENT_ID, ACCOUNT_ID)
 

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

Теперь я использую индекс таблицы для пакетного обхода. Но у меня есть некоторые проблемы с грамматикой оракула.

 # I want to use this SQL, but grammar error.
# try to use b-tree's index to locate start position, but not work

select * from CLIENT_ACCOUNT 
WHERE (CLIENT_ID, ACCOUNT_ID) > (1,2) 
AND ROWNUM < 1000
ORDER BY CLIENT_ID, ACCOUNT_ID
 

Есть ли самый быстрый способ пакетной обработки данных сенсорной таблицы?

Комментарии:

1. Что вы хотите сделать с данными в таблице?

2. вы имеете в виду прохождение данных иерархии сверху вниз и сортировку строк на одном и том же уровне иерархии. Я не вижу ничего из этого в вашем примере с данными

3. Я хочу проверить, верны ли данные базы данных. В этом примере SQL я забываю сегмент заказа. ВЫБЕРИТЕ * ИЗ CLIENT_ACCOUNT, ГДЕ (ИДЕНТИФИКАТОР КЛИЕНТА, ИДЕНТИФИКАТОР УЧЕТНОЙ ЗАПИСИ) > (1,2) И НОМЕР СТРОКИ >

Ответ №1:

Дикое предположение:

 select * from CLIENT_ACCOUNT 
WHERE CLIENT_ID  > '1'
and   ACCOUNT_ID > '2' 
AND ROWNUM < 1000;
 

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

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


Ваша модель данных кажется странной.

Ваши столбцы определены как varchar2. Так почему же ваши критерии числовые?

Кроме того, почему по умолчанию для ключевых столбцов используется пробел? Было бы лучше оставить ненаселенные значения равными нулю. (Чтобы было ясно, NULL-это не очень хорошая вещь в индексированном столбце, это просто лучше, чем пробел.)

Комментарии:

1. Спасибо за ваш ответ. Этот SQL DDL-кодовый проект моей компании. Поэтому я не могу предоставить записи данных. Да, это странно. Столбцы имеют тип varchar2, но номер хранилища. Я хочу использовать индекс B-ДЕРЕВА для быстрого просмотра данных таблицы, чтобы проверить формат записи. ВЫБЕРИТЕ * ИЗ УЧЕТНОЙ ЗАПИСИ CLIENT_ACCOUNT, ГДЕ (ИДЕНТИФИКАТОР КЛИЕНТА, ИДЕНТИФИКАТОР УЧЕТНОЙ ЗАПИСИ) > (1,2) И НОМЕР СТРОКИ >< 1000 ЗАКАЗОВ ПО ИДЕНТИФИКАТОРУ КЛИЕНТА,ИДЕНТИФИКАТОР УЧЕТНОЙ ЗАПИСИ,если я использую [ИДЕНТИФИКАТОР КЛИЕНТА > 1 И ИДЕНТИФИКАТОР УЧЕТНОЙ ЗАПИСИ < 1000 ЗАКАЗОВ ПО ИДЕНТИФИКАТОРУ КЛИЕНТА,ИДЕНТИФИКАТОР УЧЕТНОЙ ЗАПИСИ, если я использую [ИДЕНТИФИКАТОР КЛИЕНТА >> 2], не может просматривать данные всей таблицы. И выполнять план не лучше всего.

2. Вам не нужно давать всю запись целиком. Вы можете опубликовать тестовый случай, используя только идентификатор КЛИЕНТА, идентификатор учетной ЗАПИСИ, которые — будучи номерами — не могут выдавать никаких секретов компании. Вам необходимо предоставить дополнительную информацию . Простое повторение того, что вы нам уже сказали, не способствует нашему пониманию.