大型表的数据库设计

时间:2017-05-18 11:36:40

标签: sql-server tsql sql-server-2014

我试图查看与我类似的现有问题,但是我们无法找到明确的答案。

我在一家大公司工作,我们有一个大型数据仓库(数十亿行),但这种情况非常慢,并不适合临时分析 - 我们正在寻找新的东西,但是时间跨度是几年之后现在;我(和我的部门)真的不能等待。 因此,我获得了一个新的空白SQL Server 2014数据库,我将在这里存储我们将经常使用的数据仓库中的信息。

我们主要通过第三方分析工具访问这些数据,这些工具不会缓存数据,但每次点击或添加新图表等时都会直接访问它。因此,我们需要尽可能快地提高性能,因为每次向图表添加新维度等等都会非常令人沮丧。

我从我们的数据仓库获取数据,其结构/设计通常很好;然而,有些事情我觉得很烦人(例如,顾客的名字存有日期ID,这意味着如果你看一个顾客,你会看到他们的名字随着时间的推移而变化 - 为了我的分析目的,这并不是有意义的是,我希望保持名称(和其他维度)不断回溯。

现在数据并没有真正分为事实和维度,而是介于两者之间。 我正在考虑将数据重组为事实和维度,以便例如客户名称不是与财务相关联,而是在Dimensions表中 - 这样我知道每次都会得到相同的名称。

我的问题是:将数据拆分为Facts和Dimensions会降低性能,而不是将所有行中的所有信息(列)放在一个大表中?联接是否会减慢我的查询速度?

我使用的月度数据为10-15百万行=每年120-180万行,为期3 - 6年=最多约10亿行(绝对最大值)。

这有意义吗?

谢谢。

/斯特芬。

1 个答案:

答案 0 :(得分:1)

最好将事件和维度建模,以帮助您的报告层更快地进行查询。

说到这一点,我们如何设计Dimension表和Fact表非常重要。典型的想法是将整数类型作为维度的关键,您将有灵活性来处理将来慢慢改变类型I,类型II的问题。

设计事实也很重要,大多数问题都归因于IO,因此您可以考虑使用ColumnStore事实索引,以便压缩您的数据并获得更快的性能,通过此链接以便更好地理解:

ColumnStore Index