Я ищу предложения, чтобы узнать, есть ли лучший способ выполнить эту задачу. Моя проблема в том, что есть 2 таблицы (CUSTOMER
и REF_DATA
). Я просматриваю таблицу CUSTOMER
на предмет соответствия шаблонов в таблице REF_DATA
.
Структуры таблиц и примеры данных ниже.
-- Table structures
CREATE TABLE CUSTOMER (
CUST_ID NUMBER(10),
NAME VARCHAR2(50),
EMAIL VARCHAR2(50),
CONTACT_DETAILS VARCHAR2(50)
);
CREATE TABLE REF_DATA (
CITY_NAME VARCHAR2(50)
);
-- Sample data - CUSTOMER
1 A NA +1 000 000 000
2 B NA abc SYDNEY xyz
3 C NA NEW YORK 1234
4 D NA DELHI, INDIA, 123456
5 E NA 123456
-- Sample data - REF_DATA
NEW YORK
SYDNEY
DELHI
ADELAIDE
MELBOURNE
Вариант № 1 Ниже приводится запрос на соединение. Хотя он работает, я считаю, что с точки зрения производительности он плохой. Если таблица CUSTOMER
имеет 1 миллион записей, а REF_DATA
имеет 20000
строк, набор результатов будет 1 mil x 20000
до применения предиката WHERE
.
SELECT
contact_details
FROM
CUSTOMER cust,
REF_DATA ref
WHERE
REGEXP_INSTR(cust.contact_details, ref.city_name) > 0;
Вариант №2 С Вариантом №2, поскольку нет необходимости присоединяться к какой-либо другой таблице, это будет быстрее. Однако он ограничен SQL длиной запроса и количеством шаблонов в таблице REF_DATA.
SELECT
contact_details
FROM
CUSTOMER cust
WHERE
REGEXP_LIKE(contact_details, 'NEW YORK|SYDNEY|DELHI|ADELAIDE|MELBOURNE', 'i')
Есть ли способ улучшить это?
Примечания
- Столбец
CONTACT_DETAILS
не имеет определенного индекса. - Версия БД Oracle 11g R2.