5

私たちのアプリでは、人々は1つまたは複数のプロジェクトを持っています。これらのプロジェクトには開始日と終了日があります。利用できる日数には限りがあります。

これで、特定の人の空き状況を週ごとに表示するページができました。現在18週間を示しています。

現在、特定の週の利用可能時間を計算する方法は次のとおりです。

def days_available(query_date=Date.today)
  days_engaged = projects.current.where("start_date < ? AND finish_date > ?",     query_date, query_date).sum(:days_on_project)
  available = days_total - hours_engaged
end

これは、アプリの上に記述されているページを表示すると、データベースに対して18(!)クエリが実行されることを意味します。テーブル内の複数の人の空き状況を一覧表示するページがあります。これらのページでは、クエリの量はすぐに驚異的になります。

また、かなり遅いです。

可用性の取得をよりパフォーマンスの高い方法で処理するにはどうすればよいでしょうか。

4

6 に答える 6

3

これは、エンティティで日付範囲を操作する場合の非常に一般的なシナリオです。簡単で最速の方法はSQLにあります:

イベントを数字で生成された日付テーブル ( 日付範囲から日数を生成するを参照) に結合して、1 人または複数の人が占有されている日ごとに行を作成します。この形式でデータを取得したら、日付の週の日付部分でグループ化し、グループごとに行を数えるだけです。

これを拡張して、複数の個人クエリの個人ごとにグループ化できます。

于 2012-12-17T12:08:51.657 に答える
2

SQL の観点から、ストアド プロシージャを使用して日付/範囲の要件を渡すことをお勧めします。その後、ユーザーまたは複数のユーザーのレコードセットを返すことができます。このように、コードは db に 1 回アクセスするだけで済みます。

その後、繰り返し処理を行うことで、レコードセット データを一度に出力できます。

お役に立てれば。

于 2012-12-14T23:20:51.367 に答える
1

どのクエリが実行されるかを確認します。さらに、クエリにコマンドを説明させることができます

explain select * from  project where start_date < any_date and end_date> any_date2

query のプランが表示されます。このプランを使用して、クエリを最適化します。例: フィールド end_date を使用するインデックスがある場合、 condition(end_date> any_date2 and start_date < any_date) を置き換えます。このフィールドにインデックスがある場合、このステップはインデックスを使用します。しかし、そのステップはデータベース依存です。例は nysql です。mysql でインデックスを使用する場合は、where の左側にインデックス条件を使用する必要があります。

于 2012-12-21T09:45:02.173 に答える
1

ここで何を達成しようとしているのかを正確に知るには、質問には十分な情報がありません。たとえば、コード スニペットは返されたデータベース クエリを使用しないため、それを削除して高速化することができます。おそらくこれは、投稿したコードの単なるバグですか?

そうは言っても、機能を実装するために検討すべきテクニックがいくつかあります。

データ ウェアハウス技術の使用を検討します。あなたの「可用性情報」は、「日付」と「人」をディメンション テーブルとして持つ スター スキーマのファクト テーブルと考えることができます。

次に、クエリを使用して、今週のこのプロジェクトのユーザーのリストとその空き状況などを取得できます。

データ ウェアハウジングには、これをうまく機能させるために活用できるリソースがたくさんありますが、混乱を招く可能性のある用語もたくさんあります。 (人と時間)」、データ ウェアハウス技術は非常に強力です。

于 2012-12-23T23:46:21.380 に答える
1

ストアド プロシージャを使用してクエリを SQL に送信し、データを取得します。

あなたの場合、今日の日付であるパラメータをSQlクエリに渡します。

条件とロジックを SQL ストアド プロシージャに適用します。プロシージャを使用すると、SQL からデータを取得するのに最適で最速の方法になります。また、SQL インジェクションからコードを防ぐこともできます。

Ruby on raislがわからないので、コードからそのSPを呼び出します。そこからストアドプロシージャを呼び出す方法についての手順を提供できません。

その後、ストアド プロシージャに従って fdetched されたデータは、データ テーブルなどで利用できるようになります。

データを取得したら、必要なすべてを実行できます

お役に立てれば

于 2012-12-20T06:39:55.007 に答える
1

私はRuby on Railsを理解していないので、SQLの観点から、ストアドプロシージャを記述してデータセットを返すことをお勧めします.そして、フロントエンドからデータセットに対して必要なテーブル操作を行います.DBへの不要な呼び出しを減らします.

于 2012-12-24T05:25:03.637 に答える