У меня большая таблица с множеством повторяющихся строковых данных. Чтобы сэкономить место, я переместил строковые данные в отдельную таблицу. Мои таблицы теперь выглядят примерно так:
MyRecords
RecordId (int) | FieldA (int) | FieldB (datetime) | FieldC (...) | MyString1Id (int) | MyString2Id (int) | MyString3Id (int) | ...
MyStrings
StringId (int) | StringValue (varchar)
Таблица MyRecords
имеет около 10 внешних ключей для таблицы строк. У меня есть хранимая процедура GetMyRecords
, которая извлекает список записей с фактическими строковыми значениями. Этот sp теперь имеет 10 соединений с таблицей строк для каждого отношения строки:
SELECT [Field1], [Field2], [Field3], ..., [Strings1].[StringValue], [Strings2].[StringValue], ...
FROM MyRecords INNER JOIN
MyStrings AS Strings1 ON MyRecords.MyString1Id = Strings1.StringId INNER JOIN
MyStrings AS Strings2 ON MyRecords.MyString2Id = Strings2.StringId INNER JOIN
MyStrings AS Strings3 ON MyRecords.MyString3Id = Strings3.StringId INNER JOIN
(more joins)
WHERE [Field1] = @Field1 AND [Field2] = @Field2
GetMyRecords
значительно медленнее, чем я хотел бы из-за всех соединений. Как я мог улучшить производительность для этого зр? Можно ли как-нибудь превратить это в одно соединение?
Таблица строк имеет кластеризованный первичный ключ на StringId
, и все поля where находятся в некластеризованном индексе на таблице MyRecords
.