SSIS中SQL Server OLEDB Source查询返回行数远多于SSMS执行结果问题
SSIS运行openquery返回行数异常多于SSMS的排查方向
- OLEDB驱动参数差异触发笛卡尔积
SSIS和SSMS默认调用的OLEDB驱动版本、执行参数不同,openquery的关联逻辑在SSIS运行上下文没有正确传递过滤条件,会触发隐式笛卡尔积返回过量数据。可先将查询简化为无关联的单表查询,验证返回行数是否和SSMS一致,先排除关联逻辑异常。 - 参数隐式转换导致过滤条件失效
如果openquery中用到了和SQL Server本地参数、变量交互的逻辑,SSIS的参数传递规则、编码/类型隐式转换逻辑和SSMS存在差异,会导致where条件在Oracle端不生效,返回全表数据。可将openquery改为完全静态的写死语句,排除动态参数的影响后再验证行数。 - 链接服务器上下文配置生效逻辑不同
即使使用同一登录用户,SSIS执行时链接服务器的RPC配置、排序规则兼容、数据访问权限的生效逻辑和SSMS也会存在差异,比如排序规则不兼容会导致等值判断失效,过滤条件不触发。可直接在SSIS的OLEDB源中写死完整的openquery语句,不要调用视图、存储过程,避免上下文传递异常。 - 数据流配置异常导致重复拉取
若数据流任务配置了错误的缓冲区大小、缓冲区行数参数,或是开启了事务、快照隔离级别,可能会触发数据重复拉取,看起来像是读取行数异常。可暂时将数据流目标替换为行计数转换,跳过Excel写入逻辑,验证是否为读取阶段就出现行数异常。 - Oracle端执行计划差异
SSIS和SSMS的会话参数不同,会导致Oracle生成的执行计划不一致,比如SSMS会话走了索引过滤,SSIS会话走全表扫描并触发错误的嵌套循环关联。可在Oracle端分别抓取两次执行的会话执行计划,对比差异定位问题。
内容的提问来源于stack exchange,提问作者Baldie47
相关产品推荐
相关产品推荐

