0

次の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
4

1 に答える 1

1

確かな答えはありません。しかし、私はあなたが試すことができるいくつかのことを持っています。実行プランを取得する権限がないことを理解しています。

  • しばらくそこにいた人に確認し、EXPLAINを実行できるかどうかを尋ねます。
  • account_stateにインデックスが必要になる可能性があります。経験則:結合条件またはWHERE句で使用されるすべての列にインデックスを付けます。複数列のインデックスは、複数の単一列のインデックスよりもパフォーマンスが優れている場合があります。
  • 外側のクエリに移動 できるサブクエリのWHERE句のすべての部分を移動して、2つのことをテストしてみてください。
    • これらの部分は、外部クエリの通常のWHERE句で使用します。
    • UNIONedサブクエリから選択する代わりに、内部結合を 実行するように、外部クエリを再配置します。
  • 左側の外部結合のいずれかを内部結合に置き換えることができるかどうかを判断します。「nad_name_type」を格納するテーブルは、内部結合の候補である可能性があります。(理由がわかりますか?)
  • サブクエリがビューとして実装されている場合のパフォーマンスをテストします。それについてはDBAの助けが必要かもしれません。(EXPLAINを実行できない場合は、ビューを作成できない可能性があります。)
  • サブクエリがマテリアライズクエリテーブルとして実装されている場合のパフォーマンスをテストします。DBAの支援も必要になるかもしれません。
于 2013-03-01T01:28:49.893 に答える