Синонимы таблиц SQL Server с индексами - PullRequest
9 голосов
/ 01 сентября 2009

У меня есть несколько баз данных в одном экземпляре SQL Server 2005. Я создал синоним в одной базе данных для доступа к таблице в другой базе данных, и при написании запросов я хотел бы использовать определенный индекс, однако, при оценке плана выполнения он не используется. Если я напишу запрос для явного доступа к базе данных, он будет работать, но я не могу заставить его работать, используя синоним. Например:

select *
from testdb..testtable with (index(testindex))

|--Nested Loops(Inner Join, OUTER REFERENCES:([testdb].[dbo].[testtable].[id]))
     |--Index Scan(OBJECT:([testdb].[dbo].[testtable].[testindex]))
     |--Clustered Index Seek(OBJECT:([testdb].[dbo].[testtable].[PK_testtable]), SEEK:([testdb].[dbo].[testtable].[id]=[testdb].[dbo].[testtable].[id]) LOOKUP ORDERED FORWARD)

не дает тот же план выполнения, что и

select *
from testdb_synonym with (index(testindex))

|--Clustered Index Scan(OBJECT:([testdb].[dbo].[testtable].[PK_testtable]))

Это ограничение по синонимам или мне нужно что-то конкретное, чтобы это заработало?

Ответы [ 4 ]

5 голосов
/ 27 января 2010

Это ошибка, исправленная Microsoft: см. MS KB 963684

В Microsoft SQL Server 2005 вы создать синоним для таблицы. Ты бежишь запрос против синонима. Запрос использует подсказку оптимизатора INDEX, чтобы заставить индекс. Если вы изучите исполнение план, который генерируется для запроса, вы можете найти план выполнения делает не использовать принудительный индекс.

1 голос
/ 02 сентября 2009

WITH INDEX подсказки, кажется, игнорируются для синонимов.

CREATE SYNONYM syn_master FOR master

SELECT  *
FROM    syn_master WITH (INDEX (wow_i_can_write_everything_here))

компилируется и работает нормально, несмотря на то, что в моей схеме нет индекса с именем wow_i_can_write_everything_here.

1 голос
/ 01 сентября 2009

Я протестировал то же самое, и кажется, что оптимизатор запросов игнорирует эту подсказку, когда выполняется через синоним. Подробности в том, что я выбрал * для произвольной таблицы с подсказкой индекса, чтобы использовать некластеризованный индекс. Без синонима выполняется поиск по закладке / объединение с вложенным циклом. С этим он делает сканирование таблицы. Поскольку в синтаксисе создания синонимов нет опций, я могу только предположить, что подсказка индекса игнорируется. В BOL нет подробностей о том, почему. Я бы назвал это «особенностью».

0 голосов
/ 02 сентября 2009

Вам нужен подсказка в вашем случае? Рекомендации MS - избегать индексных подсказок, если это возможно из-за того, что может сделать недействительным более оптимизированный план. Даже если он будет оптимизирован сегодня, завтра он может оказаться неэффективным из-за загрузки данных и т. Д.

Я попытался использовать синоним без подсказки в SQL Server 2008 и получил тот же план выполнения с синонимом, что и с полным именем (database.schema.table).

Я даже пытался использовать синоним с подсказкой индекса и успешно принудительно осуществлял поиск не кластеризованного индекса (и поиск ключа для получения остальных данных), и я получаю тот же план выполнения с полностью определенным именем.

Обновлена ​​ли ваша статистика? У вас есть выборочный индекс или SQL-сервер считает, что более эффективно использовать сканирование таблицы.

...