我们的Server 2012企业级设置有一个性能问题,我无法解释,我希望你们有一个想法。
我们有一个事实表,其中包含了大量的int列,我们还聚合了一个区域维度表。
这是我们事实表的结构:
这是我们维度表的结构:
事实表和维度表通过regionId列上的内部连接连接。只要我们不限制国家,这方面的表现是相当好的。
例如。
SELECT SUM(revenue) FROM factTable f INNER JOIN regionDim r ON f.regionId=r.regionId
速度快(<1秒)。
然而,
SELECT SUM(revenue) FROM factTable f INNER JOIN regionDim r ON f.regionId=r.regionId WHERE r.country IN ('France','Germany')
是相当慢(> 8秒)约500 K的记录。
我们确实有以下几个地方:
从索引或整体结构的角度来看,有什么可以改变的吗?
发布于 2013-09-25 10:07:53
dim表索引中列的顺序不允许在第二个查询的where子句中使用该索引。这是因为行由第一索引列(regionId)索引,然后由第二索引列(国家)等等索引。只使用第二列就像在只使用名字搜索某人时使用电话簿一样。尝试在country列上添加一个单独的索引,看看性能是否有所提高。
发布于 2013-09-25 11:42:55
如果没有执行计划,就很难看出问题是什么。我想知道您是否首先将维度表中的RegionID提取为表表达式或临时表,然后对事实表使用它们,如果执行速度更快的话。
也许这是:
WITH regionIDcte AS
(
SELECT regionId
FROM regionDim
WHERE country IN ('France','Germany')
)
SELECT SUM(revenue)
FROM factTable f
WHERE EXISTS
(
SELECT *
FROM regionIDcte x
WHERE f.regionId = f.regionId
);https://stackoverflow.com/questions/19001678
复制相似问题