2

Я пытаюсь получить немного дополнительную производительность от некоторых запросов sql, у которых есть предложение where в поле, которое является неидентифицированным некластеризованным index, это также внешний ключ в таблице A. Этот внешний ключ является первичным ключом в таблице B и является кластеризованным индексом.Где предложение о некластеризованном индексе Vs extra join и where where on clustered index

Что мне интересно, я получу усиление производительности, если я добавлю соединение из таблицы A в таблицу B и создаю предложение where в поле, которое является кластеризованным индексом (в отличие от некластеризованного индекса без дополнительного соединения)?

благодаря

ответ

0

Я не думаю, что так, как добавление другой таблицы будет включать в себя больше чтений. Но вам придется протестировать.

0

Нет в соответствии с Франком, для этого требуется больше страниц из таблицы B. Вы говорите, что у вас уже есть индекс NC на внешнем ключе, на котором выполняется фильтрация. Вы также можете взглянуть на взвешивание плюсов и минусов кластеризации таблицы A на FK (PK P) - если вы обычно всегда выбираете таблицу A путем фильтрации на B, это может уменьшить количество страниц, загруженных на A (но, очевидно, могут возникнуть другие вопросы, на которые может повлиять это, что может засчитываться в счет этого)

2

Чтобы действительно получить дополнительную доработку, вам будет лучше убедиться, что ваш не уникальный, некластеризованный индекс a covering index (т. е. индекс включает все столбцы, необходимые для удовлетворения запроса) для выполняемого запроса. Вы можете воспользоваться концепцией included columns, представленной в SQL 2005, чтобы помочь вам в этом.

0

Если вы считаете, как будет работать соединение, вам нужно будет искать столбец FK в таблице A, чтобы выполнить условие соединения - это сканирование, которое вы, похоже, пытаетесь избежать. Поэтому я не считаю, что это может улучшить производительность.

1

Я сделал несколько тестов. У меня две таблицы - tableA (~ 3000 строк) и tableB (~ 200 строк). оба из них имеют идентификатор столбца. Таблица A: ID - pk, TableB: ID - fk, некластеризованный индекс.

Выберите из одной таблицы:

SELECT 
    a.ID 
FROM 
    dbo.TableA a 
WHERE 
    a.ID IN (1,5,7,9,23,45,56,546,67,32,54,676) 

- ВЫПОЛНЕНИЕ ПЛАНА:

|--Index Seek(OBJECT:([Database].[dbo].[TableA].[IX_TableA_ID] AS [a]), SEEK:([a].[ID]=(1) OR [a].[ID]=(5)) ORDERED FORWARD) 

- СТАТИСТИКА IO:

Table 'TableA'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

Выбрать с помощью двух таблиц (внутреннее соединение)

SELECT 
    t.ID 
FROM 
    dbo.TableA a 
INNER JOIN 
    dbo.TableB t with(index(PK_TableBs)) ON t.ID = a.ID 
WHERE 
    t.ID IN (1,5,7,9,23,45,56,546,67,32,54,676) 

- ВЫПОЛНЕНИЕ ПЛАНА:

|--Nested Loops(Inner Join, OUTER REFERENCES:([t].[ID])) 
     |--Clustered Index Seek(OBJECT:([Database].[dbo].[TableB].[PK_TableB] AS [t]), SEEK:([t].[ID]=(1) OR [t].[ID]=(5)) ORDERED FORWARD) 
     |--Index Seek(OBJECT:([Database].[dbo].[TableA].[IX_TableA_ID] AS [a]), SEEK:([a].[ID]=[Database].[dbo].[TableB].[ID] as [t].[ID]), WHERE:([Database].[dbo].[TableA].[ID] as [a].[ID]>=(1) AND [Database].[dbo].[TableA].[ID] as [a].[ID]<=(5)) ORDERED FORWARD) 

- СТАТИСТИКА IO:

Table 'TableA'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'TableB'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

Результат:

Вторая стоимость запроса составляет 67% (относительно партии) против первого запроса (33%). Кроме того, для второго запроса требуется больше чтений.

PS. Это грязный быстрый пример, вы проверяете свое собственное.

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

  • Нет связанных вопросов^_^