2015-04-30 5 views
2

Нижеприведенный запрос выполняется быстро, когда предложение FROM содержит только один номер учетной записи (a.account_nbr) и один объектный код (a.fin_object_cd), но когда я изменяю запрос так, чтобы предложение FROM имело диапазон номера счетов и диапазон объектных кодов, для получения результатов требуется ОЧЕНЬ большое количество времени. Время от минуты до 20 минут.Любой способ ускорить этот запрос MySQL?

Запрос возвращает результаты, которые я хочу, но мне нужно сделать его более быстрым.

Что я могу сделать? Я не уверен, что бы добавить индексы к некоторым столбцам, или если есть только лучший способ написать запрос.

Если вам нужна дополнительная информация о таблицах или о том, что я пытаюсь выполнить, сообщите мне.

select 
a.account_nbr as "Account Number", 
a.account_nm as "Account Name", 
a.fin_object_cd as "Object Code", 
a.fin_obj_cd_nm as "Object Code Name", 

(select COALESCE(sum(fin_beg_bal_ln_amt),0) from kfsprd.gl_balance_t where account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and univ_fiscal_yr = "2015" and fin_balance_typ_cd != "CB") as "Beginning Balance", 

(select COALESCE(sum(trn_ldgr_entr_amt),0) FROM kfsprd.kf_f_transaction_dtl where univ_fiscal_yr = "2015" and account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and trn_debit_crdt_cd = "D") as "Debits", 
(select COALESCE(sum(trn_ldgr_entr_amt),0) FROM kfsprd.kf_f_transaction_dtl where univ_fiscal_yr = "2015" and account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and trn_debit_crdt_cd = "C" and trn_ldgr_entr_amt is not null) as "Credits", 

(
(select COALESCE(sum(fin_beg_bal_ln_amt),0) from kfsprd.gl_balance_t where account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and univ_fiscal_yr = "2015" and fin_balance_typ_cd != "CB") + 
(select COALESCE(sum(trn_ldgr_entr_amt),0) FROM kfsprd.kf_f_transaction_dtl where univ_fiscal_yr = "2015" and account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and trn_debit_crdt_cd = "D") - 
(select COALESCE(sum(trn_ldgr_entr_amt),0) FROM kfsprd.kf_f_transaction_dtl where univ_fiscal_yr = "2015" and account_nbr = a.account_nbr and fin_object_cd = a.fin_object_cd and trn_debit_crdt_cd = "C") 
) as "Ending Balance" 

from kfsprd.kf_f_transaction_dtl a where univ_fiscal_yr = "2015" and (univ_fiscal_prd_cd between "01" and "13" or 
univ_fiscal_prd_cd = "BB") and a.account_nbr between "1014000" and "1014005" and a.fin_object_cd between "0000" and "9999" and a.fin_balance_typ_cd != "CB" 
group by account_nbr, fin_object_cd 
order by account_nbr, fin_object_cd; 
+0

Как [указал это] (http://stackoverflow.com/questions/17354219/how-to-speed-up-sql-queries-indexes), вы можете создать индекс для столбцов, которые используются в где условие, если оно не является двойным или варчаром. Кроме того, [пояснить] (http://dev.mysql.com/doc/refman/5.5/en/using-explain.html) может дать вам некоторое представление о том, где вы ошибаетесь. – Jonast92

+0

Минута мне не кажется быстрой, но мы ничего не знаем о вашем наборе данных! Если бы это был я, я бы начал снова, с надлежащими DDL (и/или sqlfiddle) ВМЕСТЕ С желаемым результатом. – Strawberry

+1

Спасибо вам за помощь! Я получил ответ от кого-то, кто знаком со структурой базы данных, к которой я обращаюсь, и его предложение очень помогло! –

ответ

4

Возможно, вы добавили fin_coa_cd в предложение where? Если он имеет тот же первичный ключ, что и исходная таблица (gl_entry_t), то первые 3 столбца этой таблицы будут univ_fiscal_yr, fin_coa_cd и account_nbr. Если у вас есть код диаграммы для использования, это может помочь Oracle использовать этот индекс в основном запросе.

+2

Вау! Джонатан! Ты мужчина! Я добавил поле fin_coa_cd в предложение where не только основного запроса, но и шести подзапросов, а запрос, который ранее занимал 27 минут, занимает всего около 10 секунд! Огромное спасибо! –