質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

5回答

5594閲覧

DBからのレコード件数取得方法について

c_a

総合スコア42

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2016/12/26 08:45

やりたいこと:
DBの商品テーブル(カテゴリというカラムがあります)に対して、
Aカテゴリの商品数合計、Bカテゴリの商品数合計、Cカテゴリの商品数合計、Dカテゴリ・・・
と各カテゴリ(50カテゴリくらい)の合計数(レコード数合計)を取得したいです。

TOPページの商品カテゴリ一覧で各カテゴリの商品数合計を表示します。
なので、頻繁に呼び出されます。

わからないこと:

上記の場合、TOPページのアクセスがあるたびに、カテゴリごとにselect countのSQL文を実行するのと、商品が登録されるたびにインクリメントして各カテゴリの商品合計数を管理する処理&テーブルを設けるのどちらが良いでしょうか?

むしろ、前者はあり得ないなど、ご意見いただけたらと思います。

DBはPostgreSQLを利用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

TOPページのアクセスがあるたびに、カテゴリごとにselect countのSQL文を実行するのと、商品が登録されるたびにインクリメントして各カテゴリの商品合計数を管理する処理&テーブルを設けるのどちらが良いでしょうか?

商品がINSERT、deleteされる毎に合計テーブルを更新するトリガーを作成するか、TOPページにアクセスする度に
SQLを実行するかは、双方の頻度やテーブルの大きさ等で負荷の度合いが異なると思われます。
topページの数値にリアルタイム性がそれほどなければ、10分毎(例えば)に定期的なテーブル更新も考えられると思います。

投稿2016/12/26 10:07

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  • アクセス数
  • キャッシュ無での応答速度
  • キャッシュ有での応答速度
  • レコード数
  • 商品テーブルへのカテゴリ追加頻度
  • リアルタイム性

上記が不明なので、**これが良い!**と言えませんが、
商品数テーブルを作成し、
PostgreSQLのトリガー機能を用いて商品カテゴリに追加や削除されたタイミングで商品数をカウントする。

リアルタイム性が求められないのであれば、
cronなどの定期実行で商品数のカウントを商品数テーブルに保管する。

などなど。
私個人としてはDBに優しく別途テーブルを作成するほうがよいかなと思います。

投稿2016/12/26 09:51

mukkun

総合スコア882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

トップページ表示時処理に一票。
SQL実践講座(3):集計を行う「GROUP BY」句 - @ITあたりを参考にしてもらえれば

投稿2016/12/26 09:35

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

トップページのアクセス頻度によるので、前者がありえないということではありませんが、
例えば社内ユーザ向けでユーザ数が限られている場合は全社でいいかもしれませんし、
コンシューマ向けの人気サイトなら後者でも不十分で、集計結果を各webサーバ上にxml等の形で持っておくとか、Memcachedを使うとか色々です。
正解はないと思いますので、ご自分で判断されるか、どんなシチュエーションで使うのかを補記していろいろな方から意見をもらったらいかがでしょうか。

投稿2016/12/26 08:58

katsuya141

総合スコア367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

select count(Aカテゴリ) as Aカテゴリ,count(Bカテゴリ) as Bカテゴリ from テーブル名
で取得可能です。

追記

上記の場合、TOPページのアクセスがあるたびに、カテゴリごとにselect countのSQL文を実行するのと、商品が登録されるたびにインクリメントして各カテゴリの商品合計数を管理する処理&テーブルを設けるのどちらが良いでしょうか?

むしろ、前者はあり得ないなど、ご意見いただけたらと思います。

DBはPostgreSQLを利用しています。

申し訳ありません。
質問を最後まで読まずに回答しました。
レコード件数が多い場合は、毎回実行は現実的ではありません。
複数ユーザで使用する且、商品数の合計を出すだけであれば負荷が上がりますし、
商品情報が更新されるたびに商品合計数を管理するテーブルを更新する処理を実行する方法が良いと思います。

投稿2016/12/26 08:54

編集2016/12/26 09:46
kpiyohiko

総合スコア658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問