数据库视图会影响查询性能吗?

时间:2009-02-09 18:24:03

标签: database performance views

数据库视图只是简化数据访问的一种方法,还是在访问视图时提供了性能优势,而不仅仅是运行视图所基于的查询?我怀疑视图在功能上等同于将存储的视图查询添加到视图数据上的每个查询,这是正确的还是还有其他细节和/或优化发生?

7 个答案:

答案 0 :(得分:9)

虽然在视图中运行的某个查询和在视图外部运行的同一查询应该等效执行,但是当您需要将两个视图连接在一起时,事情会变得更加复杂。您可以轻松地将不需要的表放入查询中,或者以冗余方式引入表。数据库的优化器可能在创建良好的查询执行计划时遇到更多麻烦。因此,虽然视图在允许更细粒度的安全性等方面非常好,但它们不一定有利于模块化。

答案 1 :(得分:7)

这取决于RDBMS,但通常没有进行优化,这只是简化查询的简便方法。但是,有些数据库系统使用“物化视图”,它们使用缓存机制。

答案 2 :(得分:7)

我一直认为Views就像一个只读的存储过程。您可以提前为数据库提供尽可能多的信息,以便尽可能预编译。

您也可以索引视图,以便您可以访问所运行查询类型的数据的优化视图。

答案 3 :(得分:5)

通常,视图只是一种创建常用速记的方法,用于定义经常需要的结果集。

但是,有一个缺点。当您想要使用视图时,诱惑是在某些时候添加您认为可能需要的列。所以YAGNI被侵犯了。不仅是列,而且有时候额外的外部联接会被“加以防万一”。因此,覆盖索引可能不再涵盖,查询计划可能会增加复杂性(并降低效率)。

YAGNI是SQL设计中的一个关键概念。

答案 4 :(得分:2)

一般来说,视图应该等效于直接写在基础表上的查询。

但是:可能存在边缘情况,您可能需要测试代码。所有现代RDBMS系统都有工具,可以让您查看查询计划,并监控执行情况。当你可以触手可及的确定数据时,不要把我(或其他任何人)的话说出来。

答案 5 :(得分:2)

我知道这是一个老线程。讨论很好,但我确实想再考虑一下。性能还取决于您使用什么来提取数据。例如,如果您使用Microsoft Access等前端,则可以通过使用视图来确定某些复杂查询的性能。这是因为Access并不总是像我们希望的那样从SQL服务器中提取 - 在某些情况下,它会拉出整个表,然后尝试从那里进行本地处理!如果您使用视图则不是这样。

答案 6 :(得分:0)

是的,在所有现代RDBMS(2005年以后的MSSQL等)视图的查询计划都被缓存,消除了规划查询的开销,并加快了在线执行的相同SQL的性能。在此之前(它也适用于参数化的SQL / Prepared Statements)人们正确地认为存储过程表现得更好。

许多人仍然坚持这一点,使其成为一个现代的DB神话。自从Views / PS获得SP的缓存查询规划以来,它们已经非常均匀。

相关问题