0

小さな検証アプリケーションに sqlite を使用しています。4 つの varhchar 列と 1 つの整数の主キーを持つ単純な 1 つのテーブル データベースがあります。テーブルには 100 万行近くの行があります。私はそれを最適化し、掃除機をかけました。

次のクエリを使用して、テーブルからプレゼンス カウントを取得しています。プライバシーのため、フィールドと名前を変更しました。

                  SELECT 
                  count(*) as 'test'
                  FROM
                  my_table
                  WHERE
                  LOWER(surname) = LOWER('Oliver')
                  AND
                  UPPER(address_line2) = UPPER('Somewhere over the rainbow')  
                  AND
                  house_number IN ('3','4','5');

このクエリの実行には約 1.5 ~ 1.9 秒かかります。私はインデックスを試しましたが、実際には違いはありません。今回は悪くないように聞こえるかもしれませんが、csv ファイルの読み取りでこのテストを約 40,000 回実行する必要があるため、想像できるように、かなり迅速に加算されます。実行時間を短縮する方法に関するアイデア。私は通常、mssql または mysql で開発しているので、sqlite に欠けているトリックがあれば喜んで聞いてくれるでしょう。

ではごきげんよう。

4

2 に答える 2

1

1>2インデックス付きの列に対して関数を使用する場合、関数は順序を保持しない可能性があるため、SQLite はインデックスを使用できません。つまり、 , butなどの関数が存在する可能性がありますF(1)<F(2)。ただし、この状況を解決するにはいくつかの方法があります。

  1. インデックスを使用してクエリを高速化する場合は、大文字と小文字を固定して値を保存し、クエリ パラメーターのみを同じ大文字と小文字に変換する必要があります。
SELECT count(*) as 'test'
FROM my_table
WHERE surname = LOWER('Oliver')
  1. 大文字と小文字を区別しない LIKE 演算子を使用できます (インデックスがどのように影響を受けるかわかりません! ):
SELECT count(*) as 'test'
FROM my_table
WHERE surname LIKE 'Oliver';
  1. または、各列を次のように作成してtext collate nocase、この列に関する大文字と小文字の違いを気にする必要がなくなります。
CREATE TABLE my_table (surname text collate nocase, <... other fields here ...>);
SELECT count(*) as 'test'
FROM my_table
WHERE surname ='Oliver';

=andLIKE演算子の詳細については、こちらを参照してください。

于 2012-10-03T15:26:43.530 に答える
1
              SELECT  
              count(1) as 'test' 
              FROM 
              my_table 
              WHERE 
              surname = 'Oliver' 
              AND 
              address_line2 = 'Somewhere over the rainbow'   
              AND 
              house_number IN ('3','4','5')
              COLLATE NOCASE;
于 2012-10-03T15:41:14.327 に答える