表与视图 SQL Server 的性能

Posted

技术标签:

【中文标题】表与视图 SQL Server 的性能【英文标题】:Performance of table vs view SQL Server 【发布时间】:2017-08-30 16:12:37 【问题描述】:

我在一个数据仓库中工作,该数据仓库有一个非常大的事务数据表(数亿行)。用户想要分割数据有一些常见的方式(只查看特定的交易类型,只查看特定的供应商,一次只查看一个月等),我正试图从一个性能观点。

数据是静态的,每月加载一次。所以,我不必处理不断变化的数据。

我应该创建只包含所需记录的视图吗?或者,我应该为每个用例创建一个表并加载数据吗?

基本上,我认为我的问题是:如果我有一个大的静态表,我是否应该编写一个只过滤我想要的记录的视图,然后针对该视图进行查询?或者,我应该创建一个表,只从主表中加载我想要的记录,然后查询该表吗?

我看到很多关于“视图与查询”的讨论,但我真正要问的是“针对视图的查询与针对表的查询”。

【问题讨论】:

很难说没有一些细节。您可以索引视图,因此这对于创建获取所需数据所需的特定视图可能很有用。您可以将数据加载到测试环境中吗?所有的答案都将在执行计划中。 视图仍将查询表,因此这里不会有太大差异(如果有的话)。但如果视图被索引,它可能会有所帮助。遗憾的是,这个问题太宽泛了。 您的数据仓库架构是否使用 Inmon 或 Kimball 方法?这是在 SQL Server 中还是在 SSAS 中? @Simon - 没有视图没有存储在任何地方。这只是一个保存的查询。当您从该视图中提取数据时,它会针对基础表运行查询。除非我们在谈论索引或物化视图。这些是完全不同的动物,对于像你描述的那样是一个很好的选择。 让我说得更具体一些。事务表有 2 亿行。有 10 种交易类型。许多用户只关心 2,这使行数减少到 5000 万。我应该在 ('a','b') 子句中创建一个具有 WHERE Transactiontype 的视图吗?或者,我应该创建第二个表,具有相同的列,但只加载这两种类型的行?用户将运行查询来过滤和聚合表中的其他列:过滤某些日期或供应商类型。这是 SQLServer 2016,不使用 SSAS。不涉及其他表。它完全是平的,一张巨大的桌子。 【参考方案1】:

当我遇到 ASYNC_NETWORK_IO 等待类型时,我也不得不通过 SSIS 包将 86+ 百万行从事务表传输到我的数据仓库,所以最终我修改了 SSIS 中的查询,以批量从事务表中获取记录,并且插入我的数据仓库。 您也可以尝试使用过滤条件查看视图,但无论如何它都会从基表中查找,所以我会批量获取记录。

【讨论】:

以上是关于表与视图 SQL Server 的性能的主要内容,如果未能解决你的问题,请参考以下文章

索引视图以提高 SQL Server 上多个连接的性能

提高 sql server 2012 中的视图性能

SQL Server 性能和索引视图

CTE 中的 SQL Server 视图导致性能不佳

where 子句中使用的 SQL Server 查询性能视图

SQL Server进阶表表达式