2016-11-14 4 views
-1
SELECT 
    b.1, b.2, b.3, b.4, a.4, a.3, a.5 
FROM 
    a 
RIGHT JOIN 
    b ON a.id = b.id 

Этот запрос занимает более 7 минут.Право Присоединиться к SQL Server занимает слишком много времени

Обе таблицы имеют около 100 000 записей, и только выбор из каждой таблицы проходит около 12 секунд. В плане исполнения говорится, что таблица a имеет логические показатели около 8708 и 100% стоимости оператора. Обе таблицы имеют идентификатор CI.

+0

Ew право присоединиться. Попробуйте следующее: –

+1

Ваш запрос будет генерировать синтаксическую ошибку (нет 'b'). Он также (вероятно) генерирует множество и множество данных. Зачем вам это делать? –

+0

u используют обе одинаковые таблицы FROM right join a on a.id = b.id – Chanukya

ответ

0

Проверьте, что столбец INDEX на столбе ID существует в таблице A. Для каждой строки, выбранной в B, будет поиск строк в A на столбце ID. Если индекс не существует в этом столбце, это приведет к сканированию таблицы, то есть просмотру по 100k строк, чтобы найти строки с указанным ID. Неэффективно.


PS - Общие рекомендации: писать запросы, которые не используют RIGHT JOIN, придерживайтесь INNER, LEFT и OUTER присоединяется, если нет другого пути (там почти всегда есть).

0

Используйте этот sql ниже, чтобы помочь вам идентифицировать недостающие индексы. Думаю, вам не хватает хотя бы одного.

SELECT 
statement AS [database.scheme.table], 
column_id , column_name, column_usage, 
migs.user_seeks, migs.user_scans, 
migs.last_user_seek, migs.avg_total_user_cost, 
migs.avg_user_impact 
FROM sys.dm_db_missing_index_details AS mid 
CROSS APPLY sys.dm_db_missing_index_columns (mid.index_handle) 
INNER JOIN sys.dm_db_missing_index_groups AS mig 
ON mig.index_handle = mid.index_handle 
INNER JOIN sys.dm_db_missing_index_group_stats AS migs 
ON mig.index_group_handle=migs.group_handle 
ORDER BY mig.index_group_handle, mig.index_handle, column_id 
Смежные вопросы