【问题标题】:SSIS does not recognize Indexes?SSIS 不识别索引?
【发布时间】:2018-01-09 09:37:15
【问题描述】:

我在 varchar 列“A”上有一个带有非聚集索引的表。
当我使用 Order By A 子句时,我可以看到它扫描索引并在几秒钟内给我结果。
但是,当我将 SSIS 的 Sort Component 用于列“A”时,我可以看到对记录进行排序需要几分钟。


所以我知道它无法识别我的非聚集索引


有没有人知道为 SSIS 使用索引但不使用查询而不是组件??

【问题讨论】:

    标签: sql sql-server database ssis dataflow


    【解决方案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:

      无论是一百行还是一千万行——排序转换必须先消耗所有行,然后才能返回第一行。这可能会将所有数据用于内存中的数据流路径。潜在的一点是,如果有足够的数据,它会溢出内存。

      在右图中,您可以看到,直到一千万行都被接收到,数据流中的那个点之后的数据才能被处理。

      如果您考虑转换需要做什么,则应该会出现这种行为。在发送第一行之前,需要检查最后一行以确保它不是第一行。

      对于小而窄的数据集,这不是问题。但是,如果您的数据集很大或很宽,您会发现其中包含排序的包的性能问题。在内存中加载和排序的所有数据可能会严重影响性能

      【讨论】:

        猜你喜欢
        • 2011-11-11
        • 1970-01-01
        • 2012-08-10
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        相关资源
        最近更新 更多