回答編集履歴
11
追記
test
CHANGED
@@ -52,3 +52,4 @@
|
|
52
52
|
LEFT OUTER JOIN BACKUP_IMAGE BI
|
53
53
|
ON MAIN.ID = BI.ID
|
54
54
|
```
|
55
|
+
※NO_IMAGE = '1'になっていないがバグなのであれば、データを補正すると共に、バグ修正する方が良いのではないでしょうか。
|
10
推敲
test
CHANGED
@@ -28,6 +28,7 @@
|
|
28
28
|
```
|
29
29
|
WHEN MI.ID IS NULL AND SI.ID IS NULL AND BI.ID IS NULL
|
30
30
|
```
|
31
|
+
--------
|
31
32
|
見返してみたところ、最初に抽出する件数を絞り込めば良さそうなので(MAINとIMAGEの各テーブルが1:1という前提)、以下のSQLを試してみて下さい。
|
32
33
|
※上記に加え、インデックスを追加するか、インデックスに無い項目を参照しないようにすると更に高速になると思います
|
33
34
|
```SQL
|
9
追記
test
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
```
|
29
29
|
WHEN MI.ID IS NULL AND SI.ID IS NULL AND BI.ID IS NULL
|
30
30
|
```
|
31
|
-
見返してみたところ、最初に抽出する件数を絞り込めば良さそうなので、以下のSQLを試してみて下さい。
|
31
|
+
見返してみたところ、最初に抽出する件数を絞り込めば良さそうなので(MAINとIMAGEの各テーブルが1:1という前提)、以下のSQLを試してみて下さい。
|
32
32
|
※上記に加え、インデックスを追加するか、インデックスに無い項目を参照しないようにすると更に高速になると思います
|
33
33
|
```SQL
|
34
34
|
SELECT
|
8
推敲
test
CHANGED
@@ -29,7 +29,7 @@
|
|
29
29
|
WHEN MI.ID IS NULL AND SI.ID IS NULL AND BI.ID IS NULL
|
30
30
|
```
|
31
31
|
見返してみたところ、最初に抽出する件数を絞り込めば良さそうなので、以下のSQLを試してみて下さい。
|
32
|
-
※上記に加えインデックスを追加し
|
32
|
+
※上記に加え、インデックスを追加するか、インデックスに無い項目を参照しないようにすると更に高速になると思います
|
33
33
|
```SQL
|
34
34
|
SELECT
|
35
35
|
SUB.SEQ_NO
|
7
追記
test
CHANGED
@@ -29,6 +29,7 @@
|
|
29
29
|
WHEN MI.ID IS NULL AND SI.ID IS NULL AND BI.ID IS NULL
|
30
30
|
```
|
31
31
|
見返してみたところ、最初に抽出する件数を絞り込めば良さそうなので、以下のSQLを試してみて下さい。
|
32
|
+
※上記に加えインデックスを追加した方が更に高速になると思います
|
32
33
|
```SQL
|
33
34
|
SELECT
|
34
35
|
SUB.SEQ_NO
|
6
訂正
test
CHANGED
@@ -32,14 +32,11 @@
|
|
32
32
|
```SQL
|
33
33
|
SELECT
|
34
34
|
SUB.SEQ_NO
|
35
|
-
,MAIN.ID
|
35
|
+
,MAIN.ID
|
36
|
-
,MAIN.PROCESS_DATE
|
36
|
+
,MAIN.PROCESS_DATE
|
37
37
|
,CASE WHEN MAIN.NO_IMAGE = '1' THEN ''
|
38
38
|
WHEN MI.IMAGE_DATA IS NULL AND SI.IMAGE_DATA IS NULL AND BI.IMAGE_DATA IS NULL THEN ''
|
39
39
|
ELSE MAIN.ID ||MAIN.SEQUENCE || PROCESS_DATE END AS IMAGE_KEY
|
40
|
-
,SUB.ID
|
41
|
-
,SUB.PROCESS_DATE
|
42
|
-
,SUB.IMAGE_KEY
|
43
40
|
FROM MAIN_TABLE MAIN
|
44
41
|
inner join (
|
45
42
|
select ID , ROW_NUMBER() OVER (ORDER BY ID) AS SEQ_NO
|
5
追記
test
CHANGED
@@ -28,3 +28,28 @@
|
|
28
28
|
```
|
29
29
|
WHEN MI.ID IS NULL AND SI.ID IS NULL AND BI.ID IS NULL
|
30
30
|
```
|
31
|
+
見返してみたところ、最初に抽出する件数を絞り込めば良さそうなので、以下のSQLを試してみて下さい。
|
32
|
+
```SQL
|
33
|
+
SELECT
|
34
|
+
SUB.SEQ_NO
|
35
|
+
,MAIN.ID AS ID
|
36
|
+
,MAIN.PROCESS_DATE AS PROCESS_DATE
|
37
|
+
,CASE WHEN MAIN.NO_IMAGE = '1' THEN ''
|
38
|
+
WHEN MI.IMAGE_DATA IS NULL AND SI.IMAGE_DATA IS NULL AND BI.IMAGE_DATA IS NULL THEN ''
|
39
|
+
ELSE MAIN.ID ||MAIN.SEQUENCE || PROCESS_DATE END AS IMAGE_KEY
|
40
|
+
,SUB.ID
|
41
|
+
,SUB.PROCESS_DATE
|
42
|
+
,SUB.IMAGE_KEY
|
43
|
+
FROM MAIN_TABLE MAIN
|
44
|
+
inner join (
|
45
|
+
select ID , ROW_NUMBER() OVER (ORDER BY ID) AS SEQ_NO
|
46
|
+
from MAIN_TABLE
|
47
|
+
) sub
|
48
|
+
on MAIN.ID=sub.ID and sub.seq_no<= 100000
|
49
|
+
LEFT OUTER JOIN MAIN_IMAGE MI
|
50
|
+
ON MAIN.ID = MI.ID
|
51
|
+
LEFT OUTER JOIN SUB_IMAGE SI
|
52
|
+
ON MAIN.ID = SI.ID
|
53
|
+
LEFT OUTER JOIN BACKUP_IMAGE BI
|
54
|
+
ON MAIN.ID = BI.ID
|
55
|
+
```
|
4
追記
test
CHANGED
@@ -7,7 +7,18 @@
|
|
7
7
|
`BACKUP_IMAGE (ID, IMAGE_DATA)`
|
8
8
|
|
9
9
|
※追加したインデックスが使用されないようであれば、ヒント文を使うか、SQLの記述の書き換えを行って下さい
|
10
|
+
> SQLのうち、15行目の以下部分をコメントアウトするとコストは下がり、実行計画上のソート対象行数も10万行になりました。
|
10
11
|
|
12
|
+
対象行数までコントロールする場合は、上記以外のテーブルに同様にインデックスを追加して結合条件を以下の様にしてみて下さい。
|
13
|
+
```SQL
|
14
|
+
LEFT OUTER JOIN MAIN_IMAGE MI
|
15
|
+
ON MAIN.ID = MI.ID AND MI.IMAGE_DATE IS NOT NULL
|
16
|
+
LEFT OUTER JOIN SUB_IMAGE SI
|
17
|
+
ON MAIN.ID = SI.ID AND SI.IMAGE_DATE IS NOT NULL
|
18
|
+
LEFT OUTER JOIN BACKUP_IMAGE BI
|
19
|
+
ON MAIN.ID = BI.ID AND BI.IMAGE_DATE IS NOT NULL
|
20
|
+
```
|
21
|
+
-----------------------------------
|
11
22
|
もう一つのアプローチとしては、インデックスに無い参照を止める事です。
|
12
23
|
具体的にはIMAGE_KEYの編集条件を変える事です。
|
13
24
|
```ここに言語を入力
|
3
追記
test
CHANGED
@@ -8,3 +8,12 @@
|
|
8
8
|
|
9
9
|
※追加したインデックスが使用されないようであれば、ヒント文を使うか、SQLの記述の書き換えを行って下さい
|
10
10
|
|
11
|
+
もう一つのアプローチとしては、インデックスに無い参照を止める事です。
|
12
|
+
具体的にはIMAGE_KEYの編集条件を変える事です。
|
13
|
+
```ここに言語を入力
|
14
|
+
WHEN MI.IMAGE_DATA IS NULL AND SI.IMAGE_DATA IS NULL AND BI.IMAGE_DATA IS NULL
|
15
|
+
```
|
16
|
+
上記条件がイメージデータが無い事を表しているなら、以下に書き換えると、現状のインデックスのみで解決する事になります。
|
17
|
+
```
|
18
|
+
WHEN MI.ID IS NULL AND SI.ID IS NULL AND BI.ID IS NULL
|
19
|
+
```
|
2
追記
test
CHANGED
@@ -6,3 +6,5 @@
|
|
6
6
|
|
7
7
|
`BACKUP_IMAGE (ID, IMAGE_DATA)`
|
8
8
|
|
9
|
+
※追加したインデックスが使用されないようであれば、ヒント文を使うか、SQLの記述の書き換えを行って下さい
|
10
|
+
|
1
追記
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
結合後に行われる参照の際に、その参照項目が、使用したインデックスに含まれなければ実テーブルを参照する事になります。
|
4
4
|
|
5
|
-
ですので、質問の内容であれば、以下のインデックスを追加してみて下さい。
|
5
|
+
ですので、質問の内容であれば、インデックスのみのスキャンとなるように、以下のインデックスを追加してみて下さい。
|
6
6
|
|
7
7
|
`BACKUP_IMAGE (ID, IMAGE_DATA)`
|
8
8
|
|