2016-02-14 5 views
0

Я попытаюсь объяснить свою проблему, поскольку я не использую SQL напрямую.Улучшение производительности SELECT и UPDATE

Я использую инструмент INFORMATICA с помощью сопоставлений, обрабатывающих SQL-данные, поэтому я попытаюсь объяснить логику, которую делает моя карта в SQL.

Моя карта основном выбрать данные из ВСС (медленно изменяющееся измерение), где start_date = SYSDATE и Ind = 1 (эта таблица имеет примерно 600mil записи), используя этот запрос:

SELECT table.ACCOUNT_NUMBER, table.SUB_ACCOUNT_NUMBER, table.SUB_ACCOUNT_KEY 
FROM table 
WHERE table.CURR_IND=1 
    AND table.START_DATE=trunc(sysdate) 

Эта таблица индексов, как следующие :

SUB_ACCOUNT_KEY - UNIQUE 

Затем добавьте еще один столбец и обновите другую таблицу, имеющую приблизительно 8 мил записей. Запрос о том, что, вероятно, обновить с соединит

SET table2.ind =The_New_Column,table_2.sub_account_key = table1.sub_account_key 
WHERE Table.account_number = Table_2.account_number 
    AND table.sub_account_number = table_2.sub_account_number 

Этого table_2 являются индексами следующим образом:

(ACCOUNT_NUMBER, SUB_ACCOUNT_NUMBER) - UNIQUE 

Как выбрать и обновить занять некоторое время, чтобы обработать в зависимости от объема данных, я получаю каждый день (У нас есть 1 день каждые три месяца, что количество данных составляет около X30 обычного дня, который берется навсегда .. около 2 часов)

Итак, мой вопрос: как я могу ускорить этот процесс, имея следующие ограничение:

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

+1

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

+1

Я с @Yaron здесь - в большинстве случаев вещи с изменяющимися измерениями по своей природе ** сообщают ** базам данных, и вы хотите, чтобы столько индексов, сколько позволяет пространство для хранения. Индексы только «повреждают» производительность, когда у вас много обновлений или вставок в данные (поэтому их иногда отключают для перестроек анализа), которые, как правило, происходят в повседневных транзакционных базах данных.Даже тогда это баланс между результирующей «ограниченной» скоростью обновлений (может быть, меньше, чем вы думаете), и полезностью таблицы. –

ответ

0

предложение 1: создать индекс на основе функции :

CREATE INDEX index_name 
      ON table (TRUNC(START_DATE)); 

, как вы упомянули, это не может быть возможно, потому что вы не можете использовать индексы.

предложение 2: использовать BETWEEN:

SELECT table.ACCOUNT_NUMBER, table.SUB_ACCOUNT_NUMBER, table.SUB_ACCOUNT_KEY 
    FROM table 
WHERE table.CURR_IND=1 
    AND table.START_DATE BETWEEN TO_DATE('2016.02.14 12:00:00 AM', 'YYYY.MM.DD HH:MI:SS AM') 
          AND TO_DATE('2016.02.15 11:59:59 PM', 'YYYY.MM.DD HH:MI:SS PM'); 

(смотри также http://oraclecoder.com/tutorials/quick-tip-do-not-use-trunc-to-filter-on-a-date-and-time-field--2120)

0

Это, по существу, тот же вопрос, который вы просили под "get current date fomatted". Вам либо придется изменить свой sql, либо использовать индекс, основанный на функции. Да, индексы могут вызвать некоторые дополнительные накладные расходы на DML, но могут дать значительное улучшение в SELECT. Как и все проектные решения, вы взвешиваете выгоду и стоите того, что важно.

Смежные вопросы