SQL Server: как улучшить запрос на 3 соединения, используя дорогостоящий некластерный поиск индекса - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть запрос, который выполняет внутреннее объединение 3 таблиц.

SELECT DISTINCT A.ID, <OTHER 'A' FIELDS> 
FROM C 
LEFT JOIN B ON C.Bin_ID = B.Bin_ID 
LEFT JOIN A ON B.App_ID = A.App_ID  
WHERE
   ((A.App_NAME LIKE '%%') AND (B.App_ID IS NOT NULL))  
ORDER BY 
    A.App_NAME ASC

Данные присутствуют в упомянутых таблицах ->

  • Таблица A: 8000 строк
  • Таблица B: 900 000 строк
  • Таблица C: 10 000 000 строк

Ниже приведена статистика, представленная в плане запросов SQL Server:

Здесь дваИспользуется поиск по дорогим индексам, поиск по верхнему индексу имеет следующую статистику:

Object: B.App_ID [non clustered index, non unique] 
Seek Predicate: B.App_ID = A.App_ID[clustered index,unique]

Поиск по нижнему индексу имеет следующую статистику:

Object: C.Bin_ID [non clustered index, non unique] 
See Predicate: C.Bin_ID = B.Bin_ID[clustered index,unique]

Теперь выполнение этого запроса занимает 5 минутв среднем, и я не могу понять, что должно быть сделано, чтобы сделать это быстрее, так как запрос уже использует поиск индекса.{Все объединения необходимы для набора результатов}.Нужна помощь!

1 Ответ

1 голос
/ 01 ноября 2011

Похоже, вы выбираете только столбцы из таблицы A и проверяете только таблицу B на наличие существующих строк.

Полагаю, это даст вам тот же результат и, возможно, немного быстрее:

SELECT A.ID--, <OTHER 'A' FIELDS> 
FROM A
WHERE
   A.App_NAME LIKE '%%' AND 
   A.App_ID IN (SELECT B.App_ID
                FROM B
                  INNER JOIN C
                    ON B.Bin_ID = C.Bin_ID)
ORDER BY 
    A.App_NAME ASC
...