在视图中加入 table 或从加入中创建 table,然后在顶部查看?
Join tables in view OR create table from join, then view on top?
也许我为此使用了错误的搜索词,但我试图了解 Netezza 中的视图与 table 查询性能之间是否存在差异。我有一个库存视图,它也考虑了货币,自几年前成立以来已经增长到近 2B 条记录。该视图是通过连接多个 table 创建的,并且查询性能随着时间的推移而下降。我想知道它是否有助于创建一个新的物理 table 来执行视图当前正在执行的连接,然后将我的新视图创建为基本上是 "SELECT * FROM [THIS_NEW_TABLE]"。这个新视图在理论上是否会比视图中连接的原始视图表现得更好?我知道我可以对此进行测试以查看结果,但我试图了解为什么一个会比另一个更好。
答案是"yes",至少在大多数情况下是这样。从基础 table 与视图中选择具有以下优势:
- 引擎只需读取结果 table 的列中的数据。对于视图,可能需要阅读其他列。
- 引擎对结果 table 有准确的统计信息,可用于查询的其余部分。
- 生成的 table 可以被索引以进一步加速使用它的查询。
缺点当然是当新数据插入(或更新或删除)基 table 时 table 立即过时。如果您可以忍受这个问题——比如每天或每周重新创建一次 table——那么您应该会看到性能提升。
一些数据库提供物化视图来解决这个问题。唉,Netezza 将物化视图限制为单个 table,因此这对您没有特别帮助。
也许我为此使用了错误的搜索词,但我试图了解 Netezza 中的视图与 table 查询性能之间是否存在差异。我有一个库存视图,它也考虑了货币,自几年前成立以来已经增长到近 2B 条记录。该视图是通过连接多个 table 创建的,并且查询性能随着时间的推移而下降。我想知道它是否有助于创建一个新的物理 table 来执行视图当前正在执行的连接,然后将我的新视图创建为基本上是 "SELECT * FROM [THIS_NEW_TABLE]"。这个新视图在理论上是否会比视图中连接的原始视图表现得更好?我知道我可以对此进行测试以查看结果,但我试图了解为什么一个会比另一个更好。
答案是"yes",至少在大多数情况下是这样。从基础 table 与视图中选择具有以下优势:
- 引擎只需读取结果 table 的列中的数据。对于视图,可能需要阅读其他列。
- 引擎对结果 table 有准确的统计信息,可用于查询的其余部分。
- 生成的 table 可以被索引以进一步加速使用它的查询。
缺点当然是当新数据插入(或更新或删除)基 table 时 table 立即过时。如果您可以忍受这个问题——比如每天或每周重新创建一次 table——那么您应该会看到性能提升。
一些数据库提供物化视图来解决这个问题。唉,Netezza 将物化视图限制为单个 table,因此这对您没有特别帮助。