【问题标题】:More efficient to query a table or a view?查询表或视图更高效?
【发布时间】:2014-06-11 18:43:43
【问题描述】:

我仍在尝试准确了解视图的工作原理以及何时最好使用视图与直接查询表。这是我的场景:

  1. 所有基础数​​据都位于一个存储三个月数据的表中
  2. 该表包括四列:“TagName”、“Alarm”、“Timestamp”和“Value”; 'TagName' 和 'Timestamp' 已编入索引
  3. 此表的视图(不涉及其他表)显示一周的数据并将“警报”和“值”合并到一个列中。
  4. 此方案中使用的数据库是 SQL Server。

我只需要检索 5 - 30 分钟的数据。针对将“警报”和“值”组合到单个列(如视图)并动态设置时间范围的基础表编写查询,或者通过传入时间范围来查询现有视图是否更有效?对我来说,前者似乎是可行的方法,因为后者本质上需要两个查询。此外,在第二种情况下,第一个查询(即视图)会将不必要数量的值加载到内存中。

【问题讨论】:

  • 您使用的是哪个 DBMS? MySQL 在使用视图优化查询方面是出了名的糟糕。但只有解释才能说明

标签: sql database performance view database-table


【解决方案1】:

如果您在单个表中的数据不大,那么查询表将比首先创建视图并查询所需数据更快,因为它会避免一步。

如果数据不多并且where子句中的列被正确索引,那么通常查询应该直接转到表(在大多数情况下更快)。

当您在单个表中有非常大的数据并且需要非常频繁地对小子集进行操作时,应该使用视图。在这种情况下,视图将只获取一次所需的数据并且将起作用,因此这将有助于最大限度地减少重新执行搜索查询的时间(在单个表或连接上)

在找到解决方案之前,请验证/了解您的数据、需求并使用这两种方法进行一次运行并比较时间(我认为对表的查询应该是赢家)然后做出决定。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    一般来说,您应该使用视图尽可能简化查询。这使您的应用程序的管理更简单,还可以帮助您避免重复查询逻辑(连接和 WHERE 子句)。但是,视图可能不适合特定查询,这会导致性能下降,因为它们可能会导致特定查询中不需要的不必要操作。视图在引入不必要的复杂性时会被滥用。

    【讨论】:

    • 这里不提倡或反对视图,但我过去通过更改使用视图来反对基表的查询解决了性能问题,因为视图加入了外部查询执行的多个表不需要。
    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多