Запрос иногда не выполняется. Есть ли альтернатива? - PullRequest
0 голосов
/ 13 марта 2012

У меня есть автоматический сценарий 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+ полей.(Это количество международных звонков для оператора конкретной страны в день)

1 Ответ

1 голос
/ 13 марта 2012

Я думаю, что вы можете объединить эти разные запросы при создании таблицы intl_code.

Это означает, что вы можете написать как

CREATE TABLE intl_code as
SELECT a.*,b.code 
  FROM intl_key a, country_code b 
 WHERE SubStr(calledpartynumber,3,12)=code
    or SubStr(calledpartynumber,3,11)=code 
    or SubStr(calledpartynumber,3,10)=code
    or SubStr(calledpartynumber,3,9)=code
    or SubStr(calledpartynumber,3,8)=code
    or SubStr(calledpartynumber,3,7)=code
    or SubStr(calledpartynumber,3,6)=code
    or SubStr(calledpartynumber,3,5)=code
    or SubStr(calledpartynumber,3,4)=code
    or SubStr(calledpartynumber,3,3)=code
    or SubStr(calledpartynumber,3,2)=code
    or SubStr(calledpartynumber,3,1)=code;

так, чтобы при извлечении данных из таблицы объединение intl_key a, country_code b происходило только один раз ... оно также даст те же строки, что и при предыдущем запросе объединения.

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

попробуйте это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...