1

まず、この質問に対してより良いタイトルを思い付くことができなかったので、申し訳ありません。

私のウェブサイトにはバッジ/アチーブメントシステムがあります。コミュニティユーザーには、ウェブサイトでのアクティビティに応じて特定のバッジが付与されます。以下のSQLの例では、少なくとも100のフォーラム投稿を行ったユーザーの数を取得しています(informix dbを使用しています)。バージョン10)

SELECT tjm.userid::INTEGER AS user_id, 
  EXTEND(DBINFO("UTC_TO_DATETIME",tjm.creationdate/1000), year to fraction) 
    AS earned_date
FROM TABLE(
  MULTISET(
    SELECT jm.userid, jm.creationdate, (
      SELECT COUNT(*) from TABLE(
        MULTISET(
          SELECT userid, creationdate
          FROM jive:jivemessage
        )
      ) AS i 
      WHERE i.userid = jm.userid AND i.creationdate < jm.creationdate
    ) + 1 AS row_num
    FROM jive:jivemessage jm 
  )
) AS tjm 
WHERE tjm.row_num=100

このSQLの実行には約30分以上かかります。非常に大きなコミュニティがあり、何百万ものフォーラム投稿があります。

クエリのパフォーマンスを改善するための解決策があるかどうか知りたいですか?これに似た40個のSQLクエリがありますが、テーブルとアクティビティが異なるため、実行時間を短縮しようとしています。

4

1 に答える 1

1

私は今InformixDBを使用していませんが、以下のクエリはあなたが求めることを実行するはずであり、それはANSI SQLです(元のクエリからコピーしたEXTEND部分を除く)。

SELECT
  jm.userid
  ,EXTEND(DBINFO("UTC_TO_DATETIME",tjm.creationdate/1000), year to fraction) AS earned_date
FROM
  (
  -- This sub-query will return all Users who have 100 messages or more
  SELECT
    jm.userid
    ,count(jm.userid) as totalmessages
  FROM
    jive:jivemessage jm
  GROUP BY
    jm.userid
  HAVING
    count(jm.userid) >= 100) AS MessageCount

上記は、サブクエリを使用せずに実行できる可能性があります。私がそれを使用した唯一の理由は、元のクエリに従って、結果セットにDateEarnedを含めることです。サブクエリに追加するには、GROUP BYに追加する必要があり、クエリが2日間(23:59:59など)に実行された場合、予測できない結果が発生します。

更新2012/08/14-新しい要件に従ってクエリを書き直しました

前に述べたように、私はInformixをまったく知らないので、次のクエリが実行される場合と実行されない場合があります。

SELECT
  UsersWithBadge.userid
  ,MAX(UsersWithBadge.creationdate) as dateearned
FROM
  (
  SELECT FIRST 100
    jm.userid
    ,jm.creationdate
  FROM
    jive:jivemessage jm
    JOIN
    (-- This sub-query will return all Users who have 100 messages or more
    SELECT
      jm.userid
      ,count(jm.userid) as totalmessages
    FROM
      jive:jivemessage jm
    GROUP BY
      jm.userid
    HAVING
      count(jm.userid) >= 100)
    AS MessageCount ON
      (MessageCount.userid = jm.userid)
  ) AS UsersWithBadge     
GROUP BY
  UsersWithBadge.userid
于 2012-08-14T16:26:46.603 に答える