質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

Q&A

1回答

956閲覧

【SQL】あいまい検索機能で用いるSQL文がタイムアウトしてしまう

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

0グッド

0クリップ

投稿2020/09/18 06:43

あいまい検索機能で用いるSQL文のタイムアウトを防ぎたい(処理速度を上げたい)

Springbootフレームワークを用いて、
「テキストボックスに適当な値を入れると、その値を含む項目を表示する」という
あいまい検索機能を作成中です。

下記のようなSQL文を使用していますが、タイムアウトしてしまいます。
この書き方以外にタイムアウトしない書き方をご存じの方や
似た事象に遭って解決できた方がいらっしゃいましたら
どのように書いたらよいかご教示いただきたいです。

該当のソースコード

SELECT * FROM( SELECT s.student_id , s.student_name , t.telephone_number , a.area , b.birth_month FROM student_table AS s LEFT JOIN telephone_number_table AS t ON s.telephone_number = t.telephone_number LEFT JOIN area_table AS a ON s.area_id= a.area_id LEFT JOIN birth_month_table AS b ON s.birth_month = b.birth_month ) AS target WHERE( s.student_id IN ( SELECT css_id FROM tb_trn_rn_css_order AS od LEFT JOIN telephone_number_table AS t ON s.telephone_number = t.telephone_number LEFT JOIN area_table AS a ON s.area_id= a.area_id LEFT JOIN birth_month_table AS b ON s.birth_month = b.birth_month WHERE CAST(s.student_id AS TEXT) LIKE '%${key}%' OR s.student_name LIKE '%${key}%' OR t.telephone_number LIKE '%${key}%' OR a.area LIKE '%${key}%' OR b.birth_month LIKE '%${key}%' ) ) ORDER BY s.student_id

試したこと

上記SQLのように、先にサブクエリでIDを絞り込んでいます。

補足情報(FW/ツールのバージョンなど)

postgreSQLを使用しています。
ビューは使用できません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/09/18 06:55

それぞれのテーブルのインデックス(プライマリーを含む)を追記して下さい。 また、そのSQLの実行計画も合わせて追記して下さい。
m.ts10806

2020/09/18 06:56

実行計画の結果も追記してください。
guest

回答1

0

SQLのチューニング以前にSQLの組み立て方に無駄(というか問題)があります。
Like条件部分は相関である必要は見当たりません。

以下の様にすると、CSS_IDで絞り込まれたものに対してlikeでのフィルターが掛かるようになると思いますので改善はされると思います。

SQL

1SELECT s.student_id 2 , s.student_name 3 , t.telephone_number 4 , a.area 5 , b.birth_month 6FROM student_table AS s 7 LEFT JOIN telephone_number_table AS t 8 ON s.telephone_number = t.telephone_number 9 LEFT JOIN area_table AS a 10 ON s.area_id= a.area_id 11 LEFT JOIN birth_month_table AS b 12 ON s.birth_month = b.birth_month 13WHERE s.student_id IN (SELECT css_id FROM tb_trn_rn_css_order) 14 and ( 15 CAST(s.student_id AS TEXT) LIKE '%${key}%' 16 OR s.student_name LIKE '%${key}%' 17 OR s.telephone_number LIKE '%${key}%' 18 OR a.area LIKE '%${key}%' 19 OR s.birth_month LIKE '%${key}%' 20 ) 21ORDER BY s.student_id

likeでの部分一致はインデックスは使用されないので、likeじゃなきゃダメかどうかを見直しした方が良いと思います。
birth_month が誕生月ならlikeじゃなくても良いのでは?

先にサブクエリでIDを絞り込んでいます。

厳密にこの方法でという事なら以下のような記述ですね。

SQL

1SELECT s.student_id 2 , s.student_name 3 , t.telephone_number 4 , a.area 5 , b.birth_month 6FROM student_table AS s 7 LEFT JOIN telephone_number_table AS t 8 ON s.telephone_number = t.telephone_number 9 LEFT JOIN area_table AS a 10 ON s.area_id= a.area_id 11 LEFT JOIN birth_month_table AS b 12 ON s.birth_month = b.birth_month 13where s.student_id in ( 14 select s.student_id 15 from student_table as s 16 inner join tb_trn_rn_css_order o 17 on s.student_id=o.css_id 18 left join area_table as a 19 on s.area_id= a.area_id 20 where cast(s.student_id as text) like '%${key}%' 21 or s.student_name like '%${key}%' 22 or s.telephone_number like '%${key}%' 23 or a.area like '%${key}%' 24 or s.birth_month like '%${key}%' 25 ) 26ORDER BY s.student_id

投稿2020/09/18 07:54

編集2020/09/19 00:35
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問