视图性能增益在现代 RDBMS 中是否仍然相关
Are views performance gain still relevant in modern RDBMS
毫无疑问写 SELECT * FROM viewCostumerAddress
比 SELECT c.id,c.name,a.id,a.fullAddress FROM customer c JOIN address a on a.id_costumer=c.id ORDER BY a.id,c.Priority
更简单和直观,但是当一群人告诉你 "the view's performance is way better" 而你的测试并没有显示出这样的收获时你呢?
我进行的所有测试都使用相同的 SQL Server 2014。数据集有大约 2kk 个客户端和 2.5kk 个地址。任何时候,服务器内存消耗都不会超过 60%。冷查询测试之后总是会完全重启服务以 "force-clean" 任何预编译查询和任何缓存信息。热查询的结果仅在每个 query/view 被命中 200 次后记录,尽可能多地过滤不同的值。所有测试都在专用而非虚拟服务器(裸机)上进行了 1000 次。
然而,热查询的最终结果差异小于 1% (0.971%),冷查询的差异几乎为 0 (0.0024%)。
面对这些结果,我想知道在现代 RDBMS 世界和 "object-relational mappers" 中,性能提升的旧说法是否仍然是从视图而不是直接从表查询数据的有效理由?
PS:请尽量在你的回答中尽可能科学,提供测试方法(如果是的话)and/or 科学论文或者在报告的情况下尽可能具体和透彻你目睹的事件。
如果您有一个不是索引视图的普通视图,则不会提高性能。这是因为,当您从视图 select 时,SQL-Server 运行 T-SQL-Statement,就像没有视图一样。
以下是我的一些看法观点:
1.视图是安全层
我个人不希望任何人直接访问我的基表。
在视图中,我可以根据调用者的许可过滤掉行。
在 SQL Server 2014 之前,您无法使用表执行此操作。
2。视图正在返回特定的一组列
如果我必须更改基础表的架构,我可以以某种方式更改视图,使其 returns 与以前相同的列。如果您不使用视图并且用户自己从基表中进行 SELECT,查询可能会失败。
3。视图正在节省开发时间
您不必一遍又一遍地编写相同的 T-SQL-Statement。如果 T-SQL-语句有错误怎么办?只需将它固定在一个地方,在视图中。您可能不必更改应用程序或许多函数和存储过程。
4.使用索引视图加速 SELECTs
当您发现视图中的 INNER JOIN 太昂贵并且没有更多其他选项(如有用的索引或模式更改)时,您可以使用索引视图来加速 SELECT。但是您可能会在 INSERT、UPDATE 和 DELETE 上降低性能,因为视图的索引也必须更新。
毫无疑问写 SELECT * FROM viewCostumerAddress
比 SELECT c.id,c.name,a.id,a.fullAddress FROM customer c JOIN address a on a.id_costumer=c.id ORDER BY a.id,c.Priority
更简单和直观,但是当一群人告诉你 "the view's performance is way better" 而你的测试并没有显示出这样的收获时你呢?
我进行的所有测试都使用相同的 SQL Server 2014。数据集有大约 2kk 个客户端和 2.5kk 个地址。任何时候,服务器内存消耗都不会超过 60%。冷查询测试之后总是会完全重启服务以 "force-clean" 任何预编译查询和任何缓存信息。热查询的结果仅在每个 query/view 被命中 200 次后记录,尽可能多地过滤不同的值。所有测试都在专用而非虚拟服务器(裸机)上进行了 1000 次。
然而,热查询的最终结果差异小于 1% (0.971%),冷查询的差异几乎为 0 (0.0024%)。
面对这些结果,我想知道在现代 RDBMS 世界和 "object-relational mappers" 中,性能提升的旧说法是否仍然是从视图而不是直接从表查询数据的有效理由?
PS:请尽量在你的回答中尽可能科学,提供测试方法(如果是的话)and/or 科学论文或者在报告的情况下尽可能具体和透彻你目睹的事件。
如果您有一个不是索引视图的普通视图,则不会提高性能。这是因为,当您从视图 select 时,SQL-Server 运行 T-SQL-Statement,就像没有视图一样。
以下是我的一些看法观点:
1.视图是安全层
我个人不希望任何人直接访问我的基表。 在视图中,我可以根据调用者的许可过滤掉行。 在 SQL Server 2014 之前,您无法使用表执行此操作。
2。视图正在返回特定的一组列
如果我必须更改基础表的架构,我可以以某种方式更改视图,使其 returns 与以前相同的列。如果您不使用视图并且用户自己从基表中进行 SELECT,查询可能会失败。
3。视图正在节省开发时间
您不必一遍又一遍地编写相同的 T-SQL-Statement。如果 T-SQL-语句有错误怎么办?只需将它固定在一个地方,在视图中。您可能不必更改应用程序或许多函数和存储过程。
4.使用索引视图加速 SELECTs
当您发现视图中的 INNER JOIN 太昂贵并且没有更多其他选项(如有用的索引或模式更改)时,您可以使用索引视图来加速 SELECT。但是您可能会在 INSERT、UPDATE 和 DELETE 上降低性能,因为视图的索引也必须更新。