У меня есть сценарий, где мне нужно искать & отображать записи из огромных столов с большим количеством строк. У меня есть предопределенные критерии поиска для моих таблиц, для которых пользователь может предоставить фильтр &.Принудительное использование первичного ключа в Oracle во время поиска
Учитывая образец таблицы:
CREATE TABLE suppliers
(supplier_name varchar2(50) NOT NULL,
address varchar2(50),
city varchar2(50) NOT NULL,
state varchar2(25),
zip_code varchar2(10),
CONSTRAINT "suppliers_pk" PRIMARY KEY (supplier_name, city)
);
INSERT INTO suppliers VALUES ('ABCD','XXXX','YYYY','ZZZZ','95012');
INSERT INTO suppliers VALUES ('EFGH','MMMM','NNNN','OOOO','95010');
INSERT INTO suppliers VALUES ('IJKL','EEEE','FFFF','GGGG','95009');
я предоставил пользователю поля поиска в качестве первичного ключа - Имя поставщика, город
Если он входит в оба поля, мое исполнение запроса будет хорошо, так как он идет для сканирования индекса
SELECT supplier_name, address, city, state, zip_code FROM suppliers where supplier_name = 'ABCD' and city = 'ZZZZ';
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 102 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| SUPPLIERS | 1 | 102 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | suppliers_pk | 1 | | 1 (0)| 00:00:01 |
Однако, если он входит только один из поля поиска, моя производительность запроса будет идти плохо, так как он идет за полный стол сканирование
SELECT supplier_name, address, city, state, zip_code FROM suppliers where supplier_name = 'ABCD' ;
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 102 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| SUPPLIERS | 1 | 102 | 3 (0)| 00:00:01 |
Есть ли способ, чтобы заставить оракул думать, что это первичный ключ поиска, когда я не все ключевые поля в поиске, что-то вроде ниже (что, очевидно, не работает)
SELECT supplier_name, address, city, state, zip_code FROM suppliers where supplier_name = 'ABCD' and city = city;
Спасибо.
Oracle может сделать пропуск сканированием индексного поиском, если он считает, что это целесообразно и более эффективным, чем полное сканирование таблицы. Как правило, оптимизатор довольно хорош в выборе лучшего плана с доступными индексами, предполагая, что статистика обновлена. Если он думает, что он не может выполнить сканирование, возможно, вам нужен отдельный индекс в 'city'? Использование индекса PK вряд ли будет эффективным - вероятно, он будет выполнять полное сканирование индексов, а затем все же придется извлекать блоки данных для соответствующих строк. –
У вас всего 3 строки в таблице. Добавьте 10 000 строк, соберите статистику и проанализируйте результаты. –
Спасибо, я попробовал на стол с миллионами строк, вместо FTS вместо него использовался INDEX RANGE SCAN. – ppatkar