Индексирование по внутреннему соединению с табличной функцией и оператором OR - PullRequest
0 голосов
/ 25 октября 2019

Я внутренне соединяю большую таблицу с табличной функцией, которая возвращает значение для присоединения. К сожалению, все мои индексы игнорируются, что приводит к сканированию таблицы на большой таблице. Я только что использовал 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

У меня есть отдельные индексы на обеих полях настройки Trade Party. Сама функция запускается мгновенно. Я пытался использовать кросс-аппликации, но те же результаты. См. План выполнения ниже, показывающий стоимость запроса при сканировании таблицы большой таблицы:

enter image description here

Заранее спасибо! Сол

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Вам нужны данные только из первой таблицы. Поэтому я бы рекомендовал использовать 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
             );
1 голос
/ 25 октября 2019

ИЛИ не позволяет движку использовать индекс, поэтому я рекомендую разделить его на два разных выбора и объединить их. Таким образом, каждый выбор сможет работать с соответствующим индексом.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...