我的计划包括Users
,Reviews
和多对多关系,这些关系决定了哪些评论评为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)
有没有办法加快速度?
答案 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不支持(但?)支持这种类型的索引。