次のSQLを最適化しようとしていますが、SQLの最適化に関する知識はかなりグリーンで、あまり進んでいません(会社のポリシーにより、列やその他の識別子を一般化しました)。現在の状態では、このSQLは負荷に応じて実行するのに1〜2分。VKTINFOテーブルには約100万レコードが含まれ、GNTINFOテーブルには約300万レコードが含まれます。通常、これがバッチプロセスの場合、1〜2分は大したことではありませんが、この情報をライブで可能な限り迅速に必要とするエージェントがいます。さらに悪いことに、システムは最終的にタイムアウトになり、申し訳ありませんがエラーを返します。ユーザー。ただし、タイムアウトウィンドウを延長するオプションはありません。検索する他の基準があります。たとえば、名、郵便番号、アカウントタイプ、アカウントステータス、
このSQLを操作して選択を高速化する方法についての提案/手法があれば、この問題についての考えをいただければ幸いです。さらに詳しい情報が必要な場合は、会社の方針に準拠した情報をできる限り提供させていただきます。
編集: ここで要求されているように、VKTINFOテーブルとGNTINFOテーブルのインデックスがあります。
- 口座番号
- 有効期限
- 有効日
gnt_account_infoおよびvkt_account_infoのインデックス:
- pi_account_num
- pi_policy_num_gid
gntnadテーブルとvktnadテーブルのインデックス:
- nad_account_number
- nad_name_type
gntpolrfテーブルとvktpolrfテーブルのインデックス:
- xrf_account_number
select
processing_system,
total_premium,
quote_by,
email_address,
account_number,
expiration_date,
account_state,
xrf_file,
customer_name
from
(
select
'ABCD' as processing_system,
total_premium,
quote_by,
email_address,
account_number,
expiration_date,
account_state,
xrf_file,
customer_name
from vktinfo
left outer join vkt_account_info on account_number = pi_account_number
left outer join vktpolrf on account_number = xrf_account_number
left outer join VKTNAD on account_number = nad_account_number
and history_expiration_date=nad_history_expiration_date
and nad_name_type='HA'
WHERE effective_date >= '2013-02-01'
AND effective_date <= '2013-02-28'
AND customer_name like '_SMITH%'
AND account_state = 'South Carolina'
union all
select
'EFGH' as processing_system,
total_premium,
quote_by,
email_address,
account_number,
expiration_date,
account_state,
xrf_file,
customer_name
from gntinfo
left outer join gnt_account_info on account_number = pi_account_number
left outer join vktpolrf on account_number = xrf_account_number
left outer join GNTNAD on account_number = nad_account_number
and history_expiration_date=nad_history_expiration_date
and nad_name_type='HA'
WHERE effective_date >= '2013-02-01'
AND effective_date <= '2013-02-28'
AND customer_name like '_SMITH%'
AND account_state = 'South Carolina'
)
a
order by customer_name ASC fetch first 1000 rows only WITH UR