【问题标题】:Does a SSIS load FROM SQL Server affect database cache?从 SQL Server 加载 SSIS 会影响数据库缓存吗?
【发布时间】:2012-04-12 12:17:38
【问题描述】:

我没有太多的 ETL 经验,但我也没有找到我的问题的答案,尽管我想如果你使用它可能是不费吹灰之力的。我们目前正在研究创建一个简单的数据仓库(就像“从大多数表中复制大多数列”而不是 OLAP 样式一样简单),而且出于几个原因,我们似乎倾向于 SQL Server (2008)。

当涉及到 SQL Server 时,SSIS 似乎是此类任务的工具,但我找不到任何关于它如何影响源数据库缓存的信息,如果有的话,在加载数据时。当涉及到使用风格的缓存时,我们的一些安装在性能方面非常敏感。

但是,如果 SSIS 运行“select *”-ish 查询并且缓存被更改,那么用户的性能可能会降低到无法接受的水平,直到再次从这些查询中重建。

所以我的问题是,在从 SQL Server 数据库加载数据时,SSIS(或者有没有办法避免)会影响数据库缓存吗?

部分问题还在于源数据库可能是 Oracle 或 SQL Server 数据库,因此如果有办法避免 Oracle 的缓存影响部分,那也是很好的输入。 (我猜 Attunity 连接器是要走的路?)

(一些附加信息:我们也考虑过普通文件,但是导出导入可能比 SSIS 传输花费更长的时间?我还想我们也会研究更改数据捕获,所以如果这是相关的对于这个问题,请随意包括可能的问题/好处。)

也欢迎任何其他相关建议!

谢谢!

【问题讨论】:

    标签: sql-server-2008 ssis etl


    【解决方案1】:

    处理 SQL Server 端:

    首先,SSIS 没有做任何特殊的事情来避免缓冲池或计划缓存。
    简单测试(在非生产实例上!):

    1. 使用单个连接管理器和包含一个 OLE DB 源的单个数据流创建一个新的 SSIS 包,指向一个表,类似于:

    2. 清除缓冲池,来自 SSMS:DBCC DROPCLEANBUFFERS

    3. 使用this page 顶部的美化 dm_os_buffer_descriptors 查询验证缓存是否已清除:我明白了:

    4. 运行包

    5. 从第 (2) 步重新运行查询,并注意表的数据页(在我的示例中为 BOM_PIECE)已加载到缓存中:

    请注意,大多数 SSIS 组件都允许您提供自己的查询,因此如果您有办法避免使用缓冲池(我不知道这是否可能 - 我会听从对此了解更多的人) ,您可以将其插入到查询中。因此,在上面的示例中,不是在 OLE DB 源中选择 Table or view,而是选择 SQL command,如果您的命令需要动态文本,则选择 SQL command from variable

    最后,我可以想象您为什么要消除缓存负载 - 但是您确定要这样做吗? SQL Server 相当擅长管理内存,而您正在做的是将内存负载换成磁盘 I/O 负载,这(取决于您的用例)可能会对其他用户产生负面影响。 This question 讨论了 SQL Server 缓存。

    【讨论】:

    • 感谢您的提示!我试图运行它以查看我的查询会对缓冲区产生多大影响,但不幸的是,我们拥有最大的“性能测试数据库”,即使它包含大量数据,它现在也没有正常的使用模式它是在内部而不是在客户现场生产,所以我不确定我能从中得出任何结论。无论如何,我想我们可以使用备份/事务传送/异步复制作为最后的手段从生产数据库中获取数据,因为在这种情况下它们都是 SQL 服务器,所以我现在将其保留并开始查看甲骨文案例。
    【解决方案2】:

    阅读 this 关于 Attunity 的关于从 oracle 读取数据的文章

    “从 SQL Server 数据库加载数据时影响数据库缓存”是什么意思。 SQL Server 不缓存数据,它缓存执行计划。您使用 SSIS 的事实不会影响您的服务器(当然除了读取数据的开销)。只需使用适当的事务隔离级别。

    另外,请阅读 SSIS 组件上的 fast load 属性

    关于变更数据捕获,我看不出它如何取代 SSIS。您可以使用 CDC 选择将要加载的行,但它不会为您完成加载。

    【讨论】:

    • 感谢指点!我所说的“影响数据库”的意思是(我不是数据库如何“在幕后”做事的专家,所以我可能是错的,但是)据我所知,如果可能的话,最新的数据会保存在内存中,并且在执行“select *”-ish 查询时,从用户的角度来看,许多无趣的数据将被放入内存,而不是最近的“用户数据”。但是据我了解您的回答,SSIS 负载可以避免这种情况吗?我需要一种特殊的连接方式还是可以? (我的意思是 ODBC 连接可能会更改缓存?)
    • 关于 CDC,我的意思是它会让“select *”-ish 查询只需要在第一次运行,并且后续读取只会是几行,所以缓存问题会仅读取几行而不是整个表时不相关。
    • 啊,但也许你的意思是 SSIS 包是在源而不是在目标 DB 上运行的。也许这是正常的做法?我们不能这样做,因为在我们的例子中,源可能是一个 oracle 数据库。
    • @Diego:你确定SQL Server does not cache data, it caches execution plans 吗?我相信有一个单独的计划缓存和缓冲区缓存。来自this MS pageThe buffer manager manages the functions for reading data or index pages from the database disk files into the buffer cache。来自this MS pageMost memory used by SQL Server is allocated to the Buffer Pool, [...] SQL Server steals a proportion of this memory for use in caching query plans
    • 好吧,SQL Server 在服务器上维护了一个物理内存池,用于保存已读取的数据,但我的实际意思是,当您处理大量数据时,在 SSIS 解决方案上,你不应该真的告诉它,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2021-09-18
    相关资源
    最近更新 更多