2

我有一个 30gb 的表,它有 30-40 列。我使用此表创建报告,它会导致性能问题。我只使用该表的 4-5 列作为报告。因此,我想为报告创建第二个表。但是当原始表被更改而不使用触发器时,必须更新第二个表。

无论我的查询是什么,当查询执行时,sql 都会尝试缓存所有 30gb。当缓存满载后,sql开始使用磁盘。其实我想避免这个

我怎样才能做到这一点?有没有办法使用 ssis 提前谢谢

4

4 回答 4

3
CREATE VIEW myView
AS
SELECT
  column1,
  column3,
  column4 * column7
FROM
  yourTable

视图实际上只是一个存储的查询,就像一个宏。然后,您可以从该视图中进行选择,就好像它是一个普通表一样。

除非您使用实体化视图,否则它并不是真正的表格,它只是一个查询。所以它不会加速任何事情,但它确实封装了代码并帮助控制不同用户/登录可以读取哪些数据。

于 2012-06-22T11:57:33.543 回答
0

您可以按照您的想法创建第二个表,并在表 1 更新时使用触发器来更新表 2。

然而,触发器本身就存在性能问题。插入和更新的速度会受到影响。我建议寻找更传统的替代方案来提高查询性能,这听起来像 SQL Server,因为你提到了 SSIS。

由于 30 列中只有 4-5 列,您是否尝试过添加涵盖查询的索引?我不确定您的 WHERE 子句中是否还有更多列,但您应该先尝试一下。覆盖索引实际上会完全按照您的描述进行,因为查询永远不需要触及该表。当然,这在空间和插入/更新性能方面确实会花费一些。总是有一个权衡。

最重要的是,我无法相信您需要从 30 GB 表中提取任何给定报告的大部分行。报告的数据太多了。过滤索引可以通过仅索引最有可能被请求的行来进一步提高查询性能。例如,如果您有一个列出过去日历月结果的报告,您可以添加一个条件来仅索引行WHERE report_date > '5/1/2012'

于 2012-06-22T13:09:27.823 回答
0

如果您使用的是 SQL Server,您需要的是索引视图。使用您想要的列创建一个视图,然后在它们上放置一个索引。

索引视图将数据存储在视图中。它应该使视图与基础表保持最新,并且应该减少读取表的 I/O。注意:这假设您的 4-5 列比整个表格窄得多。

于 2012-06-22T13:24:56.710 回答
0

Dems 对视图的回答似乎很理想,但如果您真的在寻找新表,请创建它并使用触发器自动更新它。

可以为主表上的所有插入、更新和删除操作添加放置在主表上的触发器。当动作发生时,触发器触发并且可以用于执行附加功能......例如更新您的新辅助表。您将从 Inserted 和 Deleted 表 ( MSDN )中提取

这里有很多关于触发器的优秀文章: 文章 1文章 2谷歌搜索

于 2012-06-22T13:02:22.497 回答