У меня есть автоматический сценарий SQL, который при запуске выполняет следующий код
DROP TABLE INTL_KEY;
CREATE TABLE intl_key AS
SELECT callingpartynumber||calledpartynumber||timeandtimezonestartofcharging AS KEY,a.* FROM intl a;
По сути, это копия таблицы INTL с полем Первичный ключ .
Сразу после этого выполняется следующий код.
CREATE TABLE intl_code as
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,12)=code
union
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,11)=code
union
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,10)=code
union
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,9)=code
union
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,8)=code
union
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,7)=code
UNION
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,6)=code
union
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,5)=code
union
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,4)=code
union
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,3)=code
UNION
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,2)=code
UNION
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,1)=code
В этом разделе создается копия INTL_KEY и добавляется столбец с Код .Код страны из другой таблицы Country_Code соответствует набранному номеру, найденному в INTL_KEY .
Например, если набранный номер - 00912886098860 , он ищет код страны от 91xxxxxxxxxx до 9. Теперь проблема в том, предположим, допустимый код - 912 ,сначала он будет сопоставлен с
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,3)=code
. Однако, 91 также является допустимым кодом.Следовательно, он также будет сопоставлен с
SELECT a.*,b.code FROM intl_key a, country_code b WHERE SubStr(calledpartynumber,3,2)=code
. Чтобы удалить это дубликат соответствия, следующий бит кода будет
DELETE FROM intl_code WHERE ROWID NOT IN (SELECT Min(rowid) FROM intl_code GROUP BY KEY );
Keep в зависимости от того, что было найдено первыми удалите последующие совпадения.Это где проблема возникает.Иногда инструкция не может быть выполнена / займет очень много времени.(Запрос запускается через VPN, поэтому иногда существует тайм-аут, иногда, если табличное пространство слишком велико, оно не запускается и т. Д.)
Я хотел знать, есть ли способ оптимизировать то, что я хочу сделать.Если так, я был бы признателен за любую помощь с этим.Как, может быть, создать новую таблицу только с минимальным количеством строк, переданным rowid?
Если это помогает понять масштаб вещей, то в среднем 300000 новых строк создаются каждый день, причем каждая строка имеет около 50+ полей.(Это количество международных звонков для оператора конкретной страны в день)