SQL 视图或表

Posted

技术标签:

【中文标题】SQL 视图或表【英文标题】:SQL View or Table 【发布时间】:2010-02-02 11:23:30 【问题描述】:

我有一个每周更新一次的数据表。然后我有一个查询来处理这些数据并基本上返回一个代码列表以及为这些代码预订的小时数。这个查询相当复杂,运行大约需要 5 秒。

这个数据需要被数据库中的很多其他查询使用,所以我想把它放在可以被其他查询轻松访问的地方。在视图中执行此操作似乎是一个好主意,但这意味着每次调用此视图时,它都会重新运行此查询,需要 5 秒,如果一次有很多调用,那么它会导致应用程序减速。

所以我在想,在星期一导入数据时将此视图创建为表格会更好,因为这将是唯一一次更改。这是最好的主意,还是我看错了?

【问题讨论】:

如果你把它放在一个单独的表中,不要忘记在使用它的查询将使用的字段上对其进行索引。 【参考方案1】:

一位同事向我指出“物化视图”。

http://www.pgcon.org/2008/schedule/attachments/64_BSDCan2008-MaterializedViews-paper.pdf

基本上,您将数据从视图复制到表中,并将该表用作视图。该演示文稿(链接)中的要点是您可以使用触发器和函数来仅更新该表的某些部分。

非常有用,我在SQL Server中实现了这样的物化视图。

【讨论】:

【参考方案2】:

我的大多数项目都处理相同的问题。

我们有大量数据需要重新组织以用于不同目的。我们还受益于用于批处理作业和夜间流程的企业文化,因此用户对数据的快照性质有很好的了解。大多数用户首先要做的就是将数据导出到 Excel,所以这不是问题。

使用附加表是一种明智的做法。

就个人而言,我在这些表格前加上下划线。

_LargeUsefulData

这使我可以轻松地从在系统正常操作中发挥积极作用的实体中识别便利表。

【讨论】:

【参考方案3】:

听起来是个合理的方法。

由于查询代价高昂,将结果放在供其他应用程序使用的“报告”表中听起来是一个不错的折衷方案。

只要这些数据的用户对它所描述的变化感到满意,你的方法就可以了。

【讨论】:

【参考方案4】:

如果您的视图结构允许对其进行索引,则可以创建索引视图(实际上只是更新基础表时更新的数据副本)。

但是,并非每个查询都允许对其视图进行索引。

如果您的数据不是秒到秒的实际数据,那么创建表是OK

【讨论】:

【参考方案5】:

无论是在表格中还是在表格行的视图中,您仍在“查看”您的行。

我会首先尝试优化您的查询(点击您的索引,也许添加/更新/更改您的索引)并通过分析器运行它。 Profiler 提供了对您数据库决策计划的绝妙洞察力。

【讨论】:

【参考方案6】:

是的,这是朝着数据仓库方向迈出的第一步 :) 当然你应该确保你的新表总是在每周更新之后建立。

【讨论】:

【参考方案7】:

我在需要处理大数据仓库的生产支持中遇到了类似的问题。基本上,我所做的是使用 shell 脚本创建表。 shell脚本是这样运行的:

    如果临时表存在,删除 它。 通过创建表运行查询 比如 create table x as (select ....) 使用临时表和 临时创建 表格/Excel。 如果不这样做,请删除临时表 不再需要它或保留它,如果你 不要认为它会吃掉你的磁盘 空间。

所有这些都可以使用一个简单的 shell 脚本来完成。我发现它非常有用,即使现在它也能有效地运行。

【讨论】:

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

视图、存储过程或表定义函数

Oracle 数据库设计视图或表?

MySQL视图

接收关于从其父集合或表视图中删除 UICollectionViewCell(或 UITableViewCell)的通知

是否有可能根据动态打开的引用游标的输出创建视图或表?

sql语句优化