【问题标题】:Indexing on Inner Join with Table Valued Function and OR statement使用表值函数和 OR 语句对内部联接进行索引
【发布时间】:2019-10-25 10:44:29
【问题描述】:

我正在内部加入一个带有表值函数的大表,该函数返回一个要加入的值。 不幸的是,我的所有索引都被绕过,导致对大表进行表扫描。 我这里只是用了1020作为参数,但实际上这是一个变量。

select t1.*
from [DS_DataAccess_XA_EMIR_TSR] t1 (nolock)
INNER JOIN SFTR_fn_UserAccess_GetLEIAccess(1020) t2
ON t1.[Trade Party 1 - Execution Agent ID] =  t2.LEI
OR t1.[Trade Party 2 - Execution Agent ID] = t2.LEI

我在两个贸易方字段设置上都有单独的索引。该功能本身会立即运行。我也尝试过使用交叉应用,但结果相同。请参阅下面的执行计划,显示大表的表扫描查询成本:

提前致谢! 扫罗

【问题讨论】:

标签: sql sql-server indexing inner-join


【解决方案1】:

您只需要第一个表中的数据。所以,我建议使用exists 而不是join

select t1.*
from [DS_DataAccess_XA_EMIR_TSR] t1
where exists (select 1
              from SFTR_fn_UserAccess_GetLEIAccess(1020) t2
              where t1.[Trade Party 1 - Execution Agent ID] =  t2.LEI
             ) or
      exists (select 1
              from SFTR_fn_UserAccess_GetLEIAccess(1020) t2
              where t1.[Trade Party 2 - Execution Agent ID] = t2.LEI
             );

【讨论】:

  • 谢谢,我尝试过类似的方法(通过使用子查询)。它运行时的结果各不相同,但它似乎避免了对大表的表扫描,这是个好消息。
【解决方案2】:

OR 会阻止引擎使用索引,因此我建议您将其拆分为两个不同的选择,然后合并它们。因此,每个选择都可以使用相应的索引运行。

select t1.*
from [DS_DataAccess_XA_EMIR_TSR] t1 (nolock)
INNER JOIN SFTR_fn_UserAccess_GetLEIAccess(1020) t2 
           ON t1.[Trade Party 1 - Execution Agent ID] =  t2.LEI
UNION    
select t1.*
from [DS_DataAccess_XA_EMIR_TSR] t1 (nolock)
INNER JOIN SFTR_fn_UserAccess_GetLEIAccess(1020) t2 
           ON t1.[Trade Party 2 - Execution Agent ID] = t2.LEI

【讨论】:

  • 我想这在大多数情况下都很好用。不幸的是,我的表值函数引用了一个不能用作 UNION 操作数的 XML 字段。
猜你喜欢
  • 2016-05-26
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多