【发布时间】:2014-02-24 17:03:46
【问题描述】:
在 SSIS 查找中有 3 种类型的缓存.. 完全部分且无缓存。
在我们的解决方案中,它一直使用默认的(Full)。是否有任何特定的场景,它可以用于部分缓存/无缓存? 在我们的解决方案中,锁定表总是很小(例如:-我们一直在查看小表以获取类型或获取描述)。这可能是它被配置为默认(完全缓存)模式的原因?
请告诉我宝贵的建议和意见。
【问题讨论】:
标签: sql-server-2012 ssis
在 SSIS 查找中有 3 种类型的缓存.. 完全部分且无缓存。
在我们的解决方案中,它一直使用默认的(Full)。是否有任何特定的场景,它可以用于部分缓存/无缓存? 在我们的解决方案中,锁定表总是很小(例如:-我们一直在查看小表以获取类型或获取描述)。这可能是它被配置为默认(完全缓存)模式的原因?
请告诉我宝贵的建议和意见。
【问题讨论】:
标签: sql-server-2012 ssis
让我们介绍一下基础知识。
完全缓存 - 在数据流实际执行之前,所有处于完全缓存模式的查找组件将针对其源运行查询并在本地缓存所有数据。一旦数据流开始,这些转换的源系统就可以被删除,因为集成服务拥有该时间点的所有数据。
部分缓存 - 没有为部分缓存预缓存数据。对于流经转换的每一行,部分缓存将查看其内部缓存以查看查找键是否已经通过。如果有,则将使用本地副本。否则,将针对引用的系统触发单例查询以查找值。如果您有一个未优化的查找,正在拉回大量数据,非常独特的源键,那可能会变得非常昂贵。如果在远程系统中找到匹配项,则该数据将在本地缓存,直到包完成或足够的新查找生成匹配项并且缓存已满。
无缓存 - 类似于部分缓存,但它始终会针对源系统执行查询。即使您的整个导入集只有一个唯一的键值。
除非我有特定的理由不这样做,否则我会使用完整缓存。
在数据仓库中,有一种称为迟到维度的场景。您正在加载应该在参考表中具有值的东西,但直到现在您才知道该值存在!一般的解决方案是在加载期间将该值打入参考表中。在完整缓存中,引用该缺失值的每一行都找不到它,然后尝试插入它,这会导致重复。部分/无缓存将在第一次未命中时解决此问题,这将导致插入到引用表中,随后的查找将找到它并将其添加到缓存中。
我遇到的另一个需要部分/不需要缓存的情况是,当我需要范围查询时。我有带有SurrogateKey|BusinessKey|StartDate|StopDate 的表,我需要查找夹在 StartDate 和 StopDate 之间的 BusinessKey + MyDate。我使用 GUI 将 MyDate 拖到 StartDate,然后在高级编辑器中,修改现有查询以执行 BETWEEN StartDate 和 StopDate(当然,我不会使用 BETWEEN)
【讨论】:
这是关于不同缓存模式的另一篇博文: http://blogs.msdn.com/b/mattm/archive/2008/10/18/lookup-cache-modes.aspx
【讨论】: