1

顧客テーブルに生年月日DATE列があり、行数は約1,300万行です。このテーブルをクエリして、特定の月とその月の日、ただし任意の年に生まれたすべての顧客を検索したいと思います。

これを行うには、日付をcharにキャストし、キャストに対して添え字クエリを実行します。または、追加のchar列を作成するか、月と日だけを保持するように更新するか、月と日を保持する3つの新しい整数列を作成する必要があります。と年、それぞれ?

これは非常に頻繁に使用されるクエリ基準になります...

編集: ...そしてテーブルには約1300万行があります。

最善の解決策の例を教えてください。

4

2 に答える 2

2

これを実行する頻度と実行に必要な速度に応じて、日付列を日、月、年の列に分割することを検討できます。これにより検索は高速になりますが、日付全体を取得する場合は他のあらゆる種類の問題が発生します(また、日付であることの検証でも問題が発生します)。これは良い考えではありません。

速度が問題ではないと仮定すると、私は次のようなことをします。

select *
FROM Table
WHERE Month(*DateOfBirthColumn*) = *SomeMonth* AND DAY(*DateOfBirthColumn*) = *SomeDay*

現在、目の前にInformixはありませんが、構文は正しいと思います。

于 2012-12-14T04:23:42.757 に答える
2

頻繁に使用する場合は、「機能インデックス」を検討してください。Informix 11.70 InfoCentreでその用語を検索すると、関連するヒットが多数生成されます。

次を使用できます。

WHERE MONTH(date_col) = 12 AND DAY(date_col) = 25;

次のようなゲームもプレイできます。

WHERE MONTH(date_col) * 100 + DAY(date_col) = 1225;

これは機能インデックスに適しているかもしれませんが、日常の使用にはそれほど明確ではありません。ストアドプロシージャも簡単に作成できます。

関数インデックスがない場合、基準の列で関数を呼び出すことは、インデックスが使用される可能性が低いことを意味することに注意してください。

CREATE FUNCTION mmdd(date_val DATE DEFAULT TODAY) RETURNING SMALLINT AS mmdd;
    RETURN MONTH(date_val) * 100 + DAY(date_val);
END FUNCTION;

そしてそれを次のように使用します:

WHERE mmdd(date_col) = 1225;
于 2012-12-14T04:25:33.303 に答える