使用UPDATE和COUNT加速相关查询

时间:2014-06-02 10:44:05

标签: sql db2

我的计划包括UsersReviews和多对多关系,这些关系决定了哪些评论评为Helpful。随着时间的推移,有用的表会变成大约10万行,所以我决定将Count()结果缓存到Reviews表中。因此,我可以轻松告诉用户某些评论获得评分的次数。问题是,当我使用以下相关查询时,它需要很长时间。

UPDATE EXT.REVIEWS AS R 
SET HELPFUL_COUNTER = 
    (SELECT COUNT (*) 
    FROM EXT.USERS_REVIEWS_HELPFUL AS H 
    WHERE R.PK = H.REVIEW_FK)

有没有办法加快速度?

4 个答案:

答案 0 :(得分:1)

加速此类查询的一种方法是使用索引。在这种情况下,适当的索引是USERS_REVIEWS_HELPFUL(REVIEW_FK)

答案 1 :(得分:0)

我没有任何db2凭据,但是克服动态计算的两种常规方法是:1)物化视图,在访问它们之前预先计算这些值,2)随时操作数字(但这需要维护代码,以保持同步,并可能变得混乱)。我个人会看(1)然后添加一个索引。

答案 2 :(得分:0)

尝试使用MERGE

MERGE INTO EXT.REVIEWS AS R
    USING (SELECT REVIEW_FK, 
                  Count(*) Counter
             FROM EXT.USERS_REVIEWS_HELPFUL
            GROUP BY REVIEW_FK) AS H
    ON (R.PK = H.REVIEW_FK)
    WHEN MATCHED 
    THEN UPDATE SET HELPFUL_COUNTER = H.Counter;

确保EXT.REVIEWS中的更新没有触发器。

也可以创建一个单独的表(PK,Counter)而不是更新EXT.REVIEWS,但是将select的结果插入到这个单独的表中:

             INSERT INTO EXT.REV_COUNTER (PK,Counter)
              SELECT REVIEW_FK, 
                  Count(*) Counter
             FROM EXT.USERS_REVIEWS_HELPFUL
            GROUP BY REVIEW_FK

答案 3 :(得分:0)

对于DB2服务器在 IBM i 操作系统下运行的读者,您可以考虑使用EVI。

CREATE ENCODED VECTOR INDEX  EXT.USERS_REVIEWS_HELPFUL_EV1
  on EXT.USERS_REVIEWS_HELPFUL (REVIEW_FK)
  INCLUDE ( count(*) )

除了根据Gordon的建议创建一个称为基数指数的“正常”索引外,我会这样做。

运行查询时,系统只需要为每个REVIEW_FK值探测(即读取)单个索引条目,从而显着提高查询count(*)的性能。该指数的维护成本非常低,特别是与其他平台上的索引维护相比,它通常不应该成为一个问题,除非INSERT性能已经超出可接受的限制。

遗憾的是,DB2 for LUW或z / OS不支持(但?)支持这种类型的索引。