1

何百万ものデータを含む大きなテーブルがあります (大きすぎます)。

表は次のとおりです。

Post
post_id,user_id,description,creation_date, xyz, abc ,etc

primarykey for post :post_id
partition key for Post : creation_date
index on Post : user_id

Comment:
commentid,post_id, comment_creation_date,comment_type,last_modified_date

Primary key of comment = commentid
indexed colums on Comment = commentid, postid
partition key for Comment table =  comment_creation_date

注:テーブルスキーマを変更せずに新しいインデックスを作成することはできません

コメントのタイプは文字列です

comment_type のリストと comment_creation_date の範囲が与えられたので、そのタイプの comment_type を持つすべての投稿を見つける必要があります。

単純な非常に非効率的なソリューションは次のようになります

    select * from post p, comment c where c.post_id = p.post_id where c.comment_creation_date > ? and c.comment_creation_date < ?
and p.posttype IN (some list)

このクエリを最適化するにはどうすればよいですか? comment_date ではなく、コメントの last_modified_date で同じことが起こったらどうなるでしょうか。ノート:

last_modified_date is NOT indexed and comment_date Is

クエリが成功したら、1 つの投稿のすべてのコメントをまとめて取得したいと考えています。c1、c2、c3 の post1 の場合の例

PS: 私はクエリの設計が苦手です。IN はパフォーマンスが良くないことを知っています。

4

2 に答える 2

0

これで時間が節約できるかどうかはわかりませんが、コメント セクションをサブクエリに移動すると役立つかもしれません。

SELECT *
FROM Post p
JOIN (SELECT *
      FROM Comment
      WHERE comment_creation_date > ? and comment_creation_date < ?
              AND 'stringlist' LIKE '%'||comment_type||'%'
     )c
ON c.post_id = p.post_id
于 2013-06-20T16:42:35.470 に答える
0

クエリには 2 つのwhere句があるため、構文が正しくありません。また、コード内では参照しcomment_typeますが、コード内では参照しpost_typeます。私は後者を仮定します。次のように書き換えることができます。

select *
from post p, comment c
where c.post_id = p.post_id and
      c.comment_creation_date > ? and c.comment_creation_date < ? and
      p.posttype IN (some list)

Oracle には優れたオプティマイザがあるため、最適化が不十分であると想定する理由はありません。

パフォーマンスへの影響はありませんが、クエリを記述するには ANSI 標準の結合構文の方が適しています。

select *
from post p join
     comment c
     on c.post_id = p.post_id
where c.comment_creation_date > ? and c.comment_creation_date < ? and
      p.posttype IN (some list)

最適化では、どのフィルタリングをいつ行うか、結合をどのように行うかを決定できます。どちらのバージョンも、インデックスをオンにしてcomment(comment_creation_date, post_id)、場合によってはオンにすることで、より効率的にすることができますpost(post_type)(後者は、インデックスの選択性と呼ばれる異なる投稿タイプの数によって異なります)。

「INがパフォーマンスに悪いことを知っている」とはどういう意味かわかりません。これは一般的な知識ではありません。これについてあなたが持っている参照を共有してください。私の知る限り、in定数の束は、のような式の束よりもパフォーマンスが悪くないはずp.posttype = <value1> or p.posttype = <value2> . . .です。

于 2013-06-20T17:41:22.577 に答える