回答編集履歴

11

追記

2023/12/01 08:34

投稿

sazi
sazi

スコア25206

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

推敲

2023/12/01 03:29

投稿

sazi
sazi

スコア25206

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

追記

2023/12/01 03:28

投稿

sazi
sazi

スコア25206

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

推敲

2023/12/01 03:23

投稿

sazi
sazi

スコア25206

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

追記

2023/12/01 03:21

投稿

sazi
sazi

スコア25206

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

訂正

2023/12/01 03:18

投稿

sazi
sazi

スコア25206

test CHANGED
@@ -32,14 +32,11 @@
32
32
  ```SQL
33
33
  SELECT
34
34
  SUB.SEQ_NO
35
- ,MAIN.ID AS ID
35
+ ,MAIN.ID
36
- ,MAIN.PROCESS_DATE AS 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

追記

2023/12/01 03:14

投稿

sazi
sazi

スコア25206

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

追記

2023/12/01 00:49

投稿

sazi
sazi

スコア25206

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

追記

2023/12/01 00:42

投稿

sazi
sazi

スコア25206

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

追記

2023/12/01 00:29

投稿

sazi
sazi

スコア25206

test CHANGED
@@ -6,3 +6,5 @@
6
6
 
7
7
  `BACKUP_IMAGE (ID, IMAGE_DATA)`
8
8
 
9
+ ※追加したインデックスが使用されないようであれば、ヒント文を使うか、SQLの記述の書き換えを行って下さい
10
+

1

追記

2023/12/01 00:26

投稿

sazi
sazi

スコア25206

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