初心者です。
記載されているSQL(データベース)のFULLSCANをindexを効かせたいです。
使用しているのは SQL Developerです。
主キー
a.カラムA、a.カラムC、
b.カラムA、b.カラムC
index
a.カラムA、a.カラムC、
b.カラムA、b.カラムC
テーブルa
a b c(START) d(END)
0001 aa 17-08-01 17-08-31
0002 ab 18-09-01 18-09-30
0003 ac 18-04-01 18-09-30
0004 ad 17-03-01 18-04-30
0005 ae 18-03-01 99-12-31
: : : :
9999 ad 17-08-31 17-10-31
テーブルb
a b c(START) d(END)
aa 1組 20140801 20160630
aa 2組 20160701 20180930
ab 3組 20180201 20180930
ac 4組 20170101 20180430
ac 5組 20180501 99991231
ad 6組 20180201 99991231
ae 7組 20180201 99991231
ーもとめている実行結果ー
2018年9月の対象者を実行結果として表示させたいです
テーブルa
a b c d
0002 ab 18-09-01 18-09-30
0003 ac 18-04-01 18-09-30
0005 ae 18-03-01 99-12-31
テーブルb
a b c d
ab 3組 20180201 20180930
ac 5組 20180501 99991231
ae 6組 20180201 99991231
該当のソースコード
SQL SELECT a.カラムA(varchar2型) a.カラムB(varchar2型) a.カラムC(date型) a.カラムD(date型) b.カラムA(varchar2型) b.カラムB(varchar2型) b.カラムC(varchar2型) b.カラムD(varchar2型) FROM テーブルa,テーブルb WHERE a.カラムB=b.カラムA AND (a.カラムA、a.カラムC、b.カラムA、b.カラムC) IN (SELECT a.カラムA、 MAX(a.カラムC)、 b.カラムA、 MAX(b.カラムC) FROM テーブルa、テーブルb WHERE a.カラムB=b.カラムA AND a.カラムC<= TO_DATE('20180930','YYYYMMDD') AND a.カラムD >=TO_DATE('20180901','YYYYMMDD') AND b.カラムC<= '20180930' AND b.カラムD >='20180901' GROUP BY a.カラムA、b.カラムA )
考えられる原因
(1)IN句が使っているためインデックスが効かず、フルスキャンされてしまう。
回答2件
あなたの回答
tips
プレビュー