Нижеприведенный запрос выполняется быстро, когда предложение 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;
Как [указал это] (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
Минута мне не кажется быстрой, но мы ничего не знаем о вашем наборе данных! Если бы это был я, я бы начал снова, с надлежащими DDL (и/или sqlfiddle) ВМЕСТЕ С желаемым результатом. – Strawberry
Спасибо вам за помощь! Я получил ответ от кого-то, кто знаком со структурой базы данных, к которой я обращаюсь, и его предложение очень помогло! –