сумасшедший дизайн, возможно, поддельные имена таблиц делают его более странным, чем он есть.
создание индексов на основе выбранного использования.
если вы ищете по фактическим именам, таким как "Джо", вам нужен индекс FirstNames.Name
если вы ищете по идентификаторам имен, например 123, у вас есть индекс: FirstNames.FirstNameId
если вы хотите искать по FirstNames.name и / или MiddleNames.name и / или Surnames.name, у вас должны быть индексы для комбинаций, которые вы будете использовать, и чем больше вы сделаете, тем сложнее будет выбрать запрос лучший.
отказаться от просмотра и написать специальный запрос для цели:
идти после первого / среднего
select
FirstNames.name
,MiddleNames.name
,Surnames.name
FROM FirstNames
INNER JOIN MiddleNames ON FirstNames.FirstNameId=MiddleNames.FirstNameId
INNER JOIN Surnames ON FirstNames.FirstNameId=Surnames.FirstNameId
WHERE FirstNames.Name='John'
AND MiddleNames.Name='Q'
идти после последнего
select
FirstNames.name
,MiddleNames.name
,Surnames.name
FROM Surnames
INNER JOIN FirstNames ON Surnames.FirstNameId =FirstNames.FirstNameId
INNER JOIN MiddleNames ON FirstNames.FirstNameId=MiddleNames.FirstNameId
WHERE Surnames.Name='Public'
просто убедитесь, что у вас есть индексы для покрытия основной таблицы в предложении "where"
используйте SET SHOWPLAN_ALL ON, чтобы убедиться, что вы используете индекс ("сканы" плохие "ищет" хорошие ")
EDIT
если возможно, разбейте имена на части, прежде чем искать их:
exec uspSearchForPeople 'joe',null,'blogs' (1 result)
exec uspSearchForPeople 'joe',null,null (1 result)
exec uspSearchForPeople null,null,'blogs' (2 results)
exec uspSearchForPeople 'jon',null,'skeet' (1 result)
exec uspSearchForPeople null,null,'skeet' (1 result)
внутри хранимой процедуры, есть три запроса:
if @GivenFirstName is not null
--search from FirstNames where FirstNames.name=@value & join in other tables
else if @GivenMiddleName is not null
--search from MiddleNames where MiddleNames.name=@value & join in other tables
else if @GivenLastName is not null
--search from Surnames where Surnames.name=@value & join in other tables
else --error no names given
имеет индекс для всех трех таблиц имен.
если вы не можете разделить имена на части, я думаю, вам не повезло, и вам придется сканировать каждую строку в каждой таблице.
Просто подумайте о телефонной книге, если вы не используете указатель и ищете имя, вам нужно прочитать всю книгу