すべてのカテゴリ » インターネット・パソコン » 技術・プログラミング

質問

終了

県・市・町・番地 で分かれている
住所のレコードから、例えば、北海道旭川市を含む町を
SELECT DISTINCT 町 from address where 県=北海道 AND 市=旭川市
で重複を削除して抽出したのですが、処理がかなり遅いです。
同じ処理を、別のSQL文で高速に実行できないでしょうか?
DBMSには、SQLiteを、言語はC#を使っています。

以下は住所リストの例です。
"北海道" "旭川市" "パルプ町" "505"
"北海道" "旭川市" "パルプ町" "882"
"北海道" "旭川市" "パルプ町一条五丁目" "496"
"北海道" "旭川市" "パルプ町一条五丁目" "505"
"北海道" "旭川市" "パルプ町一条三丁目" "505"
"北海道" "旭川市" "パルプ町一条四丁目" "505"
"北海道" "旭川市" "パルプ町一条七丁目" "505"
"北海道" "旭川市" "パルプ町一条二丁目" "482"
"北海道" "旭川市" "パルプ町三条九丁目" "505"
"北海道" "旭川市" "パルプ町二条五丁目" "505"
"北海道" "旭川市" "パルプ町二条三丁目" "505"
"北海道" "旭川市" "パルプ町二条四丁目" "505"
"北海道" "旭川市" "パルプ町二条六丁目" "505"
"北海道" "旭川市" "旭岡一丁目" "3"
"北海道" "旭川市" "旭岡一丁目" "4"
"北海道" "旭川市" "旭岡一丁目" "5"
"北海道" "旭川市" "旭岡一丁目" "6"
"北海道" "旭川市" "旭岡五丁目" "1"
"北海道" "旭川市" "旭岡五丁目" "2"
"北海道" "旭川市" "旭岡五丁目" "3"
"北海道" "旭川市" "旭岡五丁目" "4"

  • 質問者:ひろし
  • 質問日時:2009-11-11 20:49:26
  • 0

並び替え:

候補として考えられるのは、
 SELECT DISTINCT 町 FROM ADDRESS WHERE 市=旭川市 AND 県=北海道
とする事でしょうか。(県=北海道と市=旭川市を入れ替える)


SQLはWHERE句で指定された順に検索を行います。
そのため、最初の条件の時点で対象レコードができるだけ少なくなる様にするのが、検索時間を短縮するコツです。

仮に全レコードが1万件、"県=北海道"を満たすレコードが2,000件、"市=旭川市"を満たすレコードが500件、"県=北海道 AND 市=旭川市"を満たすレコードが100件だとします。

"SELECT DISTINCT 町 FROM ADDRESS WHERE 県=北海道 AND 市=旭川市"を行うと、
 1.全レコードから"県=北海道"を満たすレコードを取得。
  1万レコードを検索し、2,000レコードに絞り込み。
 2.1の検索結果から、"市=旭川市"を満たすレコードを取得。
  2,000レコードを検索し、100レコードに絞り込み。
となります。
合計すると12,000レコード分の検索処理が行われています。

"SELECT DISTINCT 町 FROM ADDRESS WHERE 市=旭川市 AND 県=北海道"とすると、
 1.全レコードから"市=旭川市"を満たすレコードを取得。
  1万レコードを検索し、500レコードに絞り込み。
 2.1の検索結果から、"県=北海道"を満たすレコードを取得。
  500レコードを検索し、100レコードに絞り込み。
となります。
合計すると10,500レコード分の検索処理が行われています。

"市=旭川市"を先に検索する事で、検索処理を1,500レコード分少なくすることができます。
よって、"SELECT DISTINCT 町 FROM ADDRESS WHERE 市=旭川市 AND 県=北海道"とする方が、検索速度が速くなると考えられます。


WHERE句にもっと多くの条件があれば、順序の入れ替えで劇的に速くなるのですが、
たった2つではそれ程変わらないかもしれません。
そうなると、SQL以外の変更を考える必要があると思います。

例えば、DISTINCTを行わない検索を試してみてください。
この検索が速く行えるのであれば、DISTINCTに時間がかかっている事が分かります。
この場合は、C#側で重複を削除する様に変更して、処理速度を上げることができたりします。

他には、DBのインデックスをきちんと作成したり、最悪テーブル構成の見直しなども必要になるかもしれません。
個人的には、町カラムに一丁目や五丁目が入っているのが気になります。
今回の要件だけを見たら、県・市・町のテーブルと丁目・番地のテーブルに分割する方が現実的かと思います。

  • 回答者:匿名 (質問から5時間後)
  • 2
この回答の満足度
  

関連する質問・相談

Sooda!からのお知らせ

一覧を見る