SSIS 不识别索引?
Posted
技术标签:
【中文标题】SSIS 不识别索引?【英文标题】:SSIS does not recognize Indexes? 【发布时间】:2018-01-09 09:37:15 【问题描述】:我在 varchar 列“A”上有一个带有非聚集索引的表。 当我使用 Order By A 子句时,我可以看到它扫描索引并在几秒钟内给我结果。 但是,当我将 SSIS 的 Sort Component 用于列“A”时,我可以看到对记录进行排序需要几分钟。
所以我知道它无法识别我的非聚集索引
有没有人知道为 SSIS 使用索引但不使用查询而不是组件??
【问题讨论】:
【参考方案1】:Order By A
在数据库中运行。
使用排序组件时,排序在 SSIS 运行时完成。请注意,您用于提供给排序的查询中没有 order by(我假设)
它是在运行时完成的,因为它与数据源无关 - 您的源可以是 excel 或文本文件或内存数据集或多案例或枢轴或任何东西。
我的建议是尽可能多地使用数据库。
在 SSIS 包中使用排序的唯一原因是如果您的源不支持排序(即平面文件)并且您希望在包中将合并连接到其他内容。这是一个非常罕见和特殊的案例
【讨论】:
此外,当我的排序数据从某些组件传递时,合并连接不再识别它已排序。所以这是使用排序的另一个原因。正确的?还有其他解决方案吗? 您需要手动设置 IsSorted 属性。您,开发人员,是唯一知道它已排序的人。 (除非它直接来自已排序的组件)。如果您广泛使用排序组件,则会遇到性能问题。【参考方案2】:这些时候,当我研究和使用 SSIS 时,我发现使用索引的唯一方法是连接到数据库。但是,当您在流中获取数据时,您所拥有的只是记录和数据。没有索引!
所以对于像Merge Join
这样之前需要Sort component
的任务,我尝试使用Lookup
组件而不是full cache 选项。并缓存整个数据,然后在Source component
查询
ORDER BY
【讨论】:
【参考方案3】:31 Days of SSIS – What The Sorts:
无论是一百行还是一千万行——排序转换必须先消耗所有行,然后才能返回第一行。这可能会将所有数据用于内存中的数据流路径。潜在的一点是,如果有足够的数据,它会溢出内存。
在右图中,您可以看到,直到一千万行都被接收到,数据流中的那个点之后的数据才能被处理。
如果您考虑转换需要做什么,则应该会出现这种行为。在发送第一行之前,需要检查最后一行以确保它不是第一行。
对于小而窄的数据集,这不是问题。但是,如果您的数据集很大或很宽,您会发现其中包含排序的包的性能问题。在内存中加载和排序的所有数据可能会严重影响性能
【讨论】:
以上是关于SSIS 不识别索引?的主要内容,如果未能解决你的问题,请参考以下文章