我有一个30gb的表,有30-40列。我使用此表创建报告,它会导致性能问题。我只是使用此表的4-5列报告。所以,我想为报告创建第二个表。但是,在不使用触发器的情况下更改原始表时,必须更新第二个表。
无论我的查询是什么,当执行查询时,sql会尝试缓存所有30gb。当缓存完全加载时,sql开始使用磁盘。其实我想避免这个
我该怎么做? 有没有办法使用ssis做到这一点 提前谢谢
答案 0 :(得分:3)
CREATE VIEW myView
AS
SELECT
column1,
column3,
column4 * column7
FROM
yourTable
视图实际上只是一个存储的查询,就像一个宏。然后,您可以从该视图中进行选择,就像它是普通表一样。
除非您使用matierialised视图,否则它不是真正的表,它只是一个查询。因此它不会加快速度,但它会封装代码并协助控制不同用户/登录可以读取的数据。
答案 1 :(得分:0)
Dems回答这个视图似乎很理想,但是如果你真的在寻找一个新表,那么创建它并让它自动更新触发器。
可以为其上的所有“插入”,“更新”和“删除”操作添加放置在主表上的触发器。当动作发生时,触发器会触发并可用于执行其他功能...例如更新新的辅助表。您将从已插入和已删除的表格(MSDN)
中提取这里有很多关于触发器的好文章: Article 1,Article 2,Google Search
答案 2 :(得分:0)
您可以像想象的那样创建第二个表,并在表1更新时使用触发器更新表2。
但是,触发器会出现自己的性能问题;插入和更新的速度将受到影响。我建议寻找更常规的替代方案来提高查询性能,这听起来像SQL Server,因为你提到了SSIS。
由于30列中只有4-5个,您是否尝试添加涵盖查询的索引?我不确定你的WHERE子句中是否还有更多列,但你应该先尝试一下。覆盖索引实际上会完全按照您所描述的内容执行,因为查询永远不需要触及该表。当然,这在空间和插入/更新性能方面确实有一点成本。总是需要权衡。
最重要的是,我无法相信你需要为30 gb表中的任何给定报告提取大部分行。报告的数据太多了。筛选索引可以通过仅索引最有可能要求的行来进一步提高查询性能。如果您有一个列出过去日历月结果的报告,则可以添加一个条件,仅对行WHERE report_date > '5/1/2012'
编制索引。
答案 3 :(得分:0)
如果您使用的是SQL Server,那么您需要的是索引视图。使用所需的列创建视图,然后在其上放置索引。
索引视图将数据存储在视图中。它应该使视图与基础表保持同步,并且应该减少读取表的I / O.注意:这假设您的4-5列比整个表格窄得多。