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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

3361閲覧

SQLite で LEFT JOIN でタイムアウト(30秒)になってしまう

退会済みユーザー

退会済みユーザー

総合スコア0

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/04/30 10:06

Aテーブル 1万データ
Bテーブル 1万データ

それぞれ文字列(実態は数値ですが文字列型)が格納されています。
下記のSQLを投げると毎回タイムアウトが発生してしまいます。

非効率な呼び出し方をしてしまっているのではないかと思うのですが、
どのようなにすればよろしいでしょうか。

お知恵をお貸しください。

lang

1SELECT tableA.id as target_id FROM tableA LEFT JOIN tableB ON tableA.id = tableB.id WHERE tableB.id IS NULL

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

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

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

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

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

guest

回答2

0

ローカルとサーバーでの環境の違いを考えると答えは出ると思います。

pkでなければindexまわりを疑います。

変わらなければ、EXISTS句にしてみるとかですかね。

投稿2015/04/30 23:22

tyoku

総合スコア67

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

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

退会済みユーザー

退会済みユーザー

2015/05/02 05:40

pkというのは主キーのことですね。 もしかしたら設定しなかったかもしれません。 exists句は知りませんでした。試してみます。
guest

0

最近、SQLiteで2000件✕2000件のデータをLEFT JOINする機会がありました。
その時は、処理時間が10分してもタイムアウトは発生しませんでした。
ちなみに、言語はC#です。

ちょっと調べてみたのですが、PHP.iniの設定が悪そうです。
PHPをやったことが無いので、間違えているかもしれませんが
PHP.iniの「max_execution_time」を修正するとタイムアウトを回避できるようです

投稿2015/04/30 10:26

redhat98

総合スコア236

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

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

退会済みユーザー

退会済みユーザー

2015/04/30 16:38

10000x10000 だともっと時間がかかりそうですね。 ただ、ローカルサーバー上で実施すると 0.1sec ぐらいで終わってしまうんです。 全く同じコードを同じデータなのに30秒以上かかってしまうのはサーバーの設定が影響しているのでしょうか。 max_execution_time は私が管理するサーバーではないため変更できない状況なんです。
redhat98

2015/05/01 08:44

>ただ、ローカルサーバー上で実施すると 0.1sec ぐらいで終わってしまうんです。 データの件数は、1万✕1万で行っていますか? DBはデータ件数で、かなり処理速度(10倍とか)が違います。 OracleやSQL Serverでも1万✕1万は、時間がかかります。 データが1万件なのでインデックスを使ったところで、そこまで速くなるとは思えないです。 なので、SQLiteでサーバとローカルで何かが違うと思います(たぶん) max_execution_timeが変更出来ないようであれば、試しにオンメモリでSQLiteを動かしてみてはどうでしょうか? 30秒以内に処理を終わらせるのは難しいと思いますが、とりあえず処理速度は向上すると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問