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