У меня странная проблема с SQL Server 2000, и я просто не могу понять причину этого.
Есть две таблицы, каждая из которых имеет объединенный первичный ключ с кластеризованным индексом, оба ключа имеют одинаковую структуру:
(VARCHAR(11), INT, DATETIME) /* can't change this, so don't suggest I should */
Итак, присоединиться к ним так просто:
SELECT t1.Foo, t2.Bar
FROM table1 t1 INNER JOIN table2 t2 ON t1.VarcharKey = t2.VarcharKey
WHERE t1.VarcharKey = 'Foo'
Глядя на план выполнения запроса, я вижу это:
- Поиск кластерного индекса [дБ]. [Дбо]. [Таблица1]. [PK_table1] (48%)
- Поиск кластерного индекса [дБ]. [Дбо]. [Таблица2]. [PK_table2] (51%)
- Вложенные циклы (внутреннее объединение) (1%) Предупреждение: НЕТ ПРЕДСКАЗАНИЯ СОЕДИНЕНИЯ
- Выбрать (0%)
Теперь, если я сделаю это (обратите внимание на строку NVARCHAR!):
SELECT t1.Foo, t2.Bar
FROM table1 t1 INNER JOIN table2 t2 ON t1.VarcharKey = t2.VarcharKey
WHERE t1.VarcharKey = N'Foo'
Я получаю:
- Сканирование кластеризованного индекса [db]. [Dbo]. [Table1]. [PK_table1] (98%)
- Поиск кластерного индекса [дБ]. [Дбо]. [Таблица2]. [PK_table2] (1%)
- Nested Loops (Inner Join) (1%) здесь без предупреждения
- Выбрать (0%)
Такое поведение оставляет меня немного озадаченным.
- Почему появляется предупреждение "NO JOIN PREDICATE", и почему оно исчезает, когда я изменяю
'Foo'
на N'Foo'
? Мои ключевые столбцы не относятся к типу NVARCHAR, так что это не должно иметь никакого значения, или это должно быть?
- Имеет ли это предупреждение негативные последствия или я могу его игнорировать?
- Почему он переключается с поиска индекса на сканирование индекса?
Некоторая справочная информация: количество элементов таблицы составляет ок. 25 000 записей в одной таблице, ок. 12 000 записей в другом. Уровень совместимости базы данных составляет 80 (SQL Server 2000), по умолчанию сортировка SQL_Latin1_General_CP1_CI_AS
, если это вообще имеет значение.
Вот содержимое @@VERSION
:
Microsoft SQL Server 2000 - 8.00.2273 (Intel X86) 7 марта 2008 г. 22:19:58 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition для Windows NT 5.0 (сборка 2195: пакет обновления 4)
P.S .: Мне известно о KB322854 , но это не так, очевидно.