2014-01-24 2 views
0

Когда я выбираю только ИД, я не вижу кластерного сканирования индекса. Но когда я выбираю столбец XML, я вижу кластерное сканирование индекса.Сканирование индексированных кластеров

Разве индекс не используется только для предложения Where, но не для предложения select?

declare @LenderID int = null, 
@LenderCode varchar(64)= null 
--Add Lender Search as in Lender Maintenance 
if @LenderID is not NULL 
    Select @LenderCode = CODE_TX from LENDER 
    where ID = @LenderID and PURGE_DT IS NULL 

declare @StartDate datetime2 = '1/22/2014 12:00:00 AM', 
     @EndDate datetime2 = '1/24/2014 12:00:00 AM' 
select rh.id 
from REPORT_HISTORY rh 
where 
(
    (@StartDate is NULL or @EndDate is NULL) 
or 
    (RH.CREATE_DT between @StartDate and @EndDate) 
) 
and 
(
    RH.LENDER_ID = @LenderID 
or 
    @LenderCode is NULL 
) 

Также удивительно, что база данных не может обрабатывать положение как @StartDate является NULL или @EndDate является NULL и идет для сканирования индекса, он должен игнорировать поле, если оно передается в нуль.

Заранее спасибо

+0

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

+0

Он генерирует огромный xml, я попробую – Roninn

+0

Как вы определили свой кластеризованный индекс? Можете ли вы опубликовать скрипт, который его определяет? Также будет полезен скриншот фактического плана выполнения. –

ответ

0

Ответ, вероятно, будет основано на том, что оптимизатор запросов думает о вашей таблице и index-- включая, помимо прочего, размера строки и статистических данных, которые применяются.

Индексы не являются волшебными, и они не всегда помогают. Если SQL Server предпочитает использовать индекс, он должен иметь возможность эффективно искать индекс для того, что содержится в индексе. Но тем не менее, если вы запрашиваете какую-либо информацию, которая не покрывается индексом, эти данные будут расположены где-то в другом месте (на диске или в памяти), и их нужно будет перекрестно ссылаться с использованием кластерного индекса.

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

Итак, что нужно проверить: ваш индекс охватывает столбец XML? Если нет, сколько строк будет возвращено вашим запросом в сравнении с количеством строк в главной таблице? Обновлена ​​ли ваша статистика? Если вы действительно хотите, вы можете использовать подсказку запроса, чтобы принудительно использовать определенный индекс, но сначала вы должны полностью изучить эти другие вещи.

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