Ваша проблема в предложениях LIKE в этом запросе. LIKE используется для сопоставления с образцом, и если у вас нет полнотекстовых индексов, определенных для всех сравниваемых столбцов, любые индексы, созданные для этих столбцов, не будут использоваться. Вместо этого следует использовать «=» и убедиться, что существуют следующие индексы:
Item.ItemName
ItemParameter.Value
ItemParameter.Name
ItemCustomParameters.Value
ItemCustomParameters.Name
Я предполагаю, что у вас уже есть индексы на
ItemCustomParameters.CustomFilterDetailsID
CustomFilterDetails.CustomFilterDetailsID
Я предполагаю, что вы НРАВИТСЯ , чтобы включить совпадения, в которых значения имеют разные регистры? Если это не так, то замена LIKE на = уже решит вашу проблему. В противном случае используйте сопоставление без учета регистра для соответствующих полей. Затем вы можете сравнить строки с различными случаями, используя =, не теряя преимущества ваших индексов:
ALTER TABLE Item ALTER COLUMN ItemName NVARCHAR(200) COLLATE LATIN1_GENERAL_CI_AS
ALTER TABLE ItemParameter ALTER COLUMN Name NVARCHAR(200) COLLATE LATIN1_GENERAL_CI_AS
ALTER TABLE ItemParameter ALTER COLUMN Value NVARCHAR(200) COLLATE LATIN1_GENERAL_CI_AS
... и т. Д.
Затем замените LIKE на =, как описано выше, и создайте свои индексы, и это должно работать нормально, хотя все еще не идеально. Если после этого у вас все еще возникают проблемы с производительностью, попробуйте связать таблицы Item, ItemParameter и ItemCustomParaeter с помощью целочисленных клавиш. Не зная структуры вашей базы данных, я не могу дать вам гораздо больше информации об этом, но по сути это означает, что задача сопоставления элементов с параметрами выполняется во время создания или назначения параметров, а не каждый раз, когда выполняется просмотр. называется.