ホームページ > データベース > mysql チュートリアル > PostgreSQL の「tsrange」型はどのようにして営業時間に合わせてクエリを最適化できるのでしょうか?

PostgreSQL の「tsrange」型はどのようにして営業時間に合わせてクエリを最適化できるのでしょうか?

Patricia Arquette
リリース: 2025-01-02 13:19:39
オリジナル
574 人が閲覧しました

How Can PostgreSQL's `tsrange` Type Optimize Queries for Business Hours?

PostgreSQL での営業時間クエリの実行

PostgreSQL では、クエリを実行して、以下に基づいて「オープン」なすべてのレコードを検索できます。日付と時刻の比較を組み合わせて、指定された稼働時間を調べます。ただし、このアプローチは、特に時間が週末に重なる場合には複雑になる可能性があります。

tsrange タイプを使用した提案されたソリューション

このクエリを簡素化して最適化するには、次のようにします。営業時間を tsrange (タイムゾーンを含まないタイムスタンプの範囲) 値のセットとして保存するようにテーブルを再設計できます。これには PostgreSQL バージョン 9.2 以降が必要で、次の手順が必要です:

テーブル レイアウト:

  • 営業時間を保存するために hours という名前の tsrange 列を持つテーブルを作成します。開閉用に別々の列を使用する代わりに

データ例:

CREATE TABLE hoo (
  hoo_id  serial PRIMARY KEY
, shop_id int NOT NULL
, hours   tsrange NOT NULL
);
ログイン後にコピー
  • 水曜日 18:30 から木曜日 05:00 UTC の営業時間は挿入可能as:
INSERT INTO hoo(shop_id, hours)
VALUES (123, '[1996-01-03 18:30, 1996-01-04 05:00]');
ログイン後にコピー

除外制約:

  • GiST インデックスを使用してショップごとのエントリの重複を防ぐために、除外制約が追加されます。

ヘルパー関数:

  • 2 つのヘルパー関数 f_hoo_time() と f_hoo_hours() は、タイムスタンプを正規化し、日曜日の午前 0 時をまたぐ範囲を分割するために定義されています。

最適化されたクエリ:

新しいテーブル構造とヘルパー関数を使用すると、クエリを次のように簡素化できます:

SELECT *
FROM hoo
WHERE hours @> f_hoo_time(now());
ログイン後にコピー

利点:

  • tsrange を使用すると、クエリ構文が簡素化され、サポートされているインデックス。
  • 除外制約により、データの整合性が確保され、エントリの重複が防止されます。
  • GiST インデックスは、時間フィールドに基づいた高速かつ効率的な検索を提供します。
  • SP-GiSTわずか数時間のインデックスにより、多数の結果を含むクエリのパフォーマンスがさらに向上します。

以上がPostgreSQL の「tsrange」型はどのようにして営業時間に合わせてクエリを最適化できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート