2015-08-12 3 views
1

У меня есть этот простой запрос на SQL Server 2008 R2:Почему этот запрос использует два сканирования таблицы?

SELECT Art.ID_Articulo, 
     conv.Factor AS PesoToneladas 
FROM dbo.Articulos Art 
     LEFT JOIN dbo.Conversiones conv 
       ON conv.ID_Articulo = Art.ID_Articulo 
       AND conv.ID_Unidad1 = Art.ID_Unidad 

Таблица Articulos индексируемой индивидуально ID_Articulo и ID_Unidad. Таблица Conversiones индексируется по отдельности ID_Articulo и ID_Unidad1.

Планы выполнения показывают сканирование таблицы для обеих таблиц, занимающих много ресурсов.

Как я могу найти причину?

+0

У вас есть индексы на столбцах, к которым вы присоединяетесь? –

+1

Нам нужно будет увидеть обе таблицы, скриптовые (включая индексы). –

+0

Из того, что я знаю, оптимизатор также предпочитает выполнять сканирование таблицы вместо поиска индекса (даже если есть индекс в этом столбце), если объем данных, которые будут извлечены, будет очень большим (поскольку один «объемный» доступ данных будет быстрее, чем индивидуально извлекать каждую строку). Таким образом, это зависит от количества данных, которые должен вернуть запрос. –

ответ

1

В вашем запросе нет фильтров, учитывая это, вы будете агрегировать все 2 таблицы. Использование индексов sql может потребовать больше ресурсов для поиска. Поэтому, вероятно, дешевле делать сканирование таблицы.

Если вы будете использовать фильтры для сокращения ваших данных, sql может решить изменить план.

+0

Может быть, но что, если он не хочет добавлять * больше * фильтров к запросу (кроме тех, которые у него уже есть в JOIN)? –

+0

Тогда 2 сканирования, вероятно, лучшее решение для запроса. Это, вероятно, самый быстрый/менее ресурсоемкий план. Возможно, вы сможете сделать это быстрее, используя включенные столбцы в индексах .. но это пустая трата дискового пространства, и никто не гарантирует более быстрый ответ. –

+1

Полностью согласен, я опубликовал аналогичный комментарий по этому вопросу. –

Смежные вопросы