我在varchar列'A'上有一个非聚集索引的表。
当我使用 Order By A 子句时,我可以看到它扫描索引并在几秒钟内给出结果。
但是当我使用SSIS的排序组件列'A'时,我可以看到排序记录需要几分钟。
所以我理解它无法识别我的非聚集索引
有没有人知道为SSIS使用索引但不使用查询而不是组件?
答案 0 :(得分:5)
Order By A
在数据库中运行。
使用排序组件时,排序在SSIS运行时完成。请注意,用于提供给排序的查询中没有订单(我假设)
它在运行时完成,因为它与数据源无关 - 您的源可能是excel或文本文件或内存数据集或多重酶或数据透视图或其他任何内容。
我的建议是尽可能多地使用数据库。
在SSIS包中使用排序的唯一原因是,如果您的源不支持排序(即平面文件),并且您希望在包中进行合并连接。这是一个非常罕见且具体的案例
答案 1 :(得分:4)
这些年来,当我研究并使用SSIS时,我发现使用索引的唯一方法是连接到数据库。但是,当您在流中获取数据时,您所拥有的只是记录和数据。没有索引!
因此对于像Merge Join
这样的任务,在此之前需要Sort component
,我尝试使用Lookup
组件代替 full cache 选项。并缓存整个数据,然后在ORDER BY
查询
Source component
答案 2 :(得分:2)
31 Days of SSIS – What The Sorts:
是否有一百行或一千万行 - 排序转换必须消耗所有行才能返回第一行。这可能会为所有行提供所有数据。内存中的数据流路径。而潜在的一点是因为如果有足够的数据,它将溢出内存。
在右边的图像中,您可以看到,直到收到了一千万行,才能处理数据流中该点之后的数据。
如果您考虑转换需要执行的操作,则应该预期此行为。在第一行可以发送之前,需要检查最后一行以确保它不是第一行。
对于小而窄的数据集,这不是问题。但是,如果您的数据集很大或很宽,那么您可以在其中包含各种类型的包中发现性能问题。在内存中加载和排序的所有数据都可能是严重的性能损失