0

我们的 SQL Server 2012 Enterprise 设置存在性能问题,我无法解释,希望大家有所了解。

我们有一个事实表,其中包含我们聚合的一堆 int 列以及一个区域维度表。

这是我们的事实表的结构:

  • regionId (int)
  • 收入(十进制 10,2)
  • orderIntake (十进制 10,2)

这是我们维度表的结构:

  • 世界区域(varchar(100)9
  • 集群(varchar(100))
  • 国家 (varchar(100))
  • regionId (int)

事实表和维度表通过 regionId 列上的 INNER JOIN 连接。只要我们不限制国家,这方面的表现是相当不错的。

例如

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')

对于大约 50 万条记录,速度非常慢(> 8 秒)。

我们确实有以下 indizes:

  • regionId 列上事实表上的 ColumnStore 索引
  • 维度表上的聚集索引 (regionId,country,cluster,worldRegion)

从索引或整体结构的角度来看,我们有什么可以改变的吗?

4

2 回答 2

2

暗表索引中的列顺序不允许在第二个查询的 where 子句中使用此索引。这是因为行由第一个索引列(regionId)索引,然后由第二个(国家)索引,依此类推。仅使用第 2 列就像在仅按名字搜索某人时使用电话簿一样。尝试在国家列上放置一个单独的索引,看看性能是否有所提高。

于 2013-09-25T10:07:53.717 回答
0

如果没有执行计划,很难看出问题所在。我想知道您是否首先将维度表中的 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
  );
于 2013-09-25T11:42:55.137 回答