2013-09-25 183 views
0

我们无法解释我们的SQL Server 2012 Enterprise安装程序存在性能问题,我希望你们有一个想法。SQL Server 2012性能问题

我们有一个事实表,其中包含一列int列和一个区域维度表。

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

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

而且这是我们尺寸表的结构:

  • worldR
  • regionId(INT)

事实表和维度表经由连接egion(VARCHAR(100)9

  • 簇(VARCHAR(100))
  • 国家(VARCHAR(100)) INNER JOIN在regionId列上。只要我们不限制国家,这个表现相当好。

    E.g.

    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秒)左右500K记录。

    我们也有到位以下indizes:上的regionId列上维度表

  • 聚集索引(regionId,国家,产业集群,worldRegion)
  • 事实表

    • 列存储索引

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

    +2

    难道你看查询计划?它对使用的索引有何评论? – cdoubleplusgood

    回答

    2

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

    0

    没有执行计划,很难看出问题是什么。我想知道是否从维度表中首先将RegionIDs提取到表格表达式或临时表格中,然后在事实表格中使用它们,如果它将更快地执行。

    也许这:

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