29. 参考資料
• 検証(インデックスを先に作成)
• 次にインデックスを作成します。
• 8つのインデックスを作成します。
29
create index c1_index on itest (c1);
create index c2_index on itest (c2);
create index c3_index on itest (c3);
create index c4_index on itest (c4);
create index c5_index on itest (c5);
create index c6_index on itest (c6);
create index c7_index on itest (c7);
create index c8_index on itest (c8);
30. 参考資料
• 検証(インデックスを先に作成)
• 10万件のデータをインサートするのにかかる時間を検証します。
30
select now(); -- 開始時刻を表示
-- 再帰SQLを使用して、10万件のデータを作成する
insert into itest
with recursive DUMMY(i) as
(
select 1 i
union all
select i+1 from DUMMY where i < 100000
)
select i , 'c1' || i , 'c2' || i, 'c3' || i, 'c4' || i, 'c5' ||
i, 'c6' || i, 'c7' || i, 'c8' || i from DUMMY;
select now(); -- 終了時刻を表示
33. 参考資料
• 検証(インデックスを後に作成)
• 次は、データを作成した後にインデックスを作成する場合を検証しま
す。
• テーブルを一度削除して再作成し、空の状態にしてください。
33
select now(); -- 開始時刻を表示
-- 10万件インサート
insert into itest
with recursive DUMMY(i) as
(select 1 i
union all
select i+1 from DUMMY where i < 100000
)
select i , 'c1' || i , 'c2' ||
i, 'c3' || i, 'c4' || i, 'c5' ||
i, 'c6' || i, 'c7' || i, 'c8' ||
i from DUMMY;
-- インデックス作成
create index c1_index on itest (c1);
create index c2_index on itest (c2);
create index c3_index on itest (c3);
create index c4_index on itest (c4);
create index c5_index on itest (c5);
create index c6_index on itest (c6);
create index c7_index on itest (c7);
create index c8_index on itest (c8);
select now(); -- 終了時刻を表示
43. 演習問題
• 演習問題(インデックス使用の有無)
43
-- ④
SELECT * FROM books
WHERE title = 'SQL';
-- ⑤
SELECT * FROM books
WHERE title LIKE '%QL';
-- ⑥
SELECT * FROM books
WHERE title LIKE 'SQ%';
44. 演習問題
• 演習問題(インデックス使用の有無)
44
-- ⑦
SELECT * FROM books
WHERE id = 100 OR title = 'SQL';
-- ⑧
SELECT * FROM books
WHERE id = 100 AND title = 'SQL';
-- ⑨
SELECT * FROM books
WHERE title IS NULL;
45. 演習問題
• 演習問題(インデックス使用の有無)
45
-- ⑩
SELECT * FROM books
WHERE trim(title) = 'SQL';
-- ⑪
SELECT * FROM books
WHERE substr(title, 1, 2) = 'SQ';
-- ⑫
SELECT * FROM books
WHERE title IN ('AAA', 'BBB', 'SQL');
48. 演習問題
• 演習問題(table2)
• マルチカラムインデックスの場合
48
-- ①
SELECT * FROM novels
WHERE publisher = 'a1';
-- ②
SELECT * FROM novels
WHERE author = 'b1';
-- ③
SELECT * FROM novels
WHERE publisher = 'a1' OR author = 'b1';
49. 演習問題
• 演習問題(table2)
49
-- ④
SELECT * FROM novels
WHERE publisher = 'a1' AND author = 'b1';
-- ⑤
SELECT * FROM novels
WHERE author = 'b1' AND publisher = 'a1';
50. 演習問題
• 演習問題(table2)
50
-- ⑥
SELECT * FROM novels
WHERE publisher = 'a1' AND trim(author) = 'b1';
-- ⑦
SELECT * FROM novels
WHERE author = 'b1' AND trim(publisher) = 'a1';
51. インデックスまとめ
• インデックスが使用されない条件指定まとめ
• 否定(<>)を使用している
WHERE column1 <> '100'
• 広い範囲での条件指定(ヒットする件数が多い場合)
WHERE column1 BETWEEN '1' AND '99999999'
• OR を使用している
WHERE column1 = '100' OR column2 = 'abc'
• NULLでの検索をしている
WHERE column1 IS NULL
※ただしNULLの扱いはDBMSに依存する。
51
52. インデックスまとめ
• インデックスが使用されない条件指定まとめ
• あいまい検索(後方一致)を使用している
WHERE column1 LIKE '%abc%'
• 絞り込み対象のカラムに対して演算を適用している
WHERE column1 * 1.1 = 1100
• 絞り込み対象のカラムに対して関数を適用している
WHERE TRIM(column1) = 'abc'
• CASE式を利用している
WHERE column1 = CASE
WHEN column2 = 100 then 'A'
WHEN column2 = 200 then 'B'
END
52