テーブルのリレーションよりもサブクエリの方が速い

現在、検査データは検査室の windows 7 上にある sqlserver に同じネットワーク上の ubuntu からアクセスして、必要な項目を読み込んで ubuntu 上のsqlite3 に書き込み、それを端末の linux mint や windows から閲覧しています。

テーブルは2つあって、kensa と kekka テーブルです。
kensa は日付・受付番号・カルテ番号などです。
kekka は日付・受付番号・検査結果などが記録されています。

この2つのテーブルをリレーションして検査結果を閲覧することができます。
最初は以下のようなクエリでデータを抽出していました。


SELECT kekka.hizuke, kekka.koumokuNo, kekka.Kekka 
FROM kensa 
INNER JOIN kekka ON kensa.hizuke = kekka.hizuke AND kensa.uketukeNo = kekka.uketukeNo 
WHERE kensa.karteNo = '6102027' ;

このクエリでデータの抽出はできるのですが、500 万行の kekka テーブルから 3157 個のデータを抽出するのに 5 秒ちょっとかかります。

テーブルのリレーションじゃなくてサブクエリを使うと抽出時間が劇的に速くなります。


SELECT hizuke, koumokuNo, Kekka 
FROM kekka 
WHERE (hizuke, uketukeNo) IN
(SELECT hizuke, uketukeNo FROM kensa WHERE karteNo = '6102027') ;

このクエリの実行時間は 2 秒ちょっとと半分以下になります。

しかもサブクエリを使う方法だと、抽出件数を限定することができます。
検査結果を過去分すべてを表示するのは効率が悪いので、以下のように過去 30 件分にすると 1 秒以内で抽出することができるようになります。


SELECT hizuke, koumokuNo, Kekka 
FROM kekka 
WHERE (hizuke, uketukeNo) IN
(SELECT hizuke, uketukeNo FROM kensa WHERE karteNo = '6102027' LIMIT 30) ;

テーブルのリレーションでも limit 30 は当然できますが、そうすると日付で限定するわけではないのでデータが途中で切れてしまうことになります。