Sql view очень медленно выполняется - PullRequest
0 голосов
/ 23 марта 2012

У меня есть этот sql view

SELECT     
    dbo.CustomFilterDetails.CustomFilterID, 
    dbo.ItemCustomParameters.CustomFilterDetailsID, 
    dbo.Item.ItemID
FROM         
    dbo.ItemCustomParameters 
INNER JOIN
    dbo.CustomFilterDetails ON dbo.ItemCustomParameters.CustomFilterDetailsID = dbo.CustomFilterDetails.CustomFilterDetailsID 
INNER JOIN
    dbo.Item ON dbo.Item.ItemName LIKE dbo.ItemCustomParameters.Value 
INNER JOIN
    dbo.ItemParameter ON dbo.ItemParameter.ItemID IS NULL 
                      OR dbo.ItemParameter.Value LIKE dbo.ItemCustomParameters.Value 
                      OR dbo.ItemParameter.Name LIKE dbo.ItemCustomParameters.Name

Почему он так медленно работает?

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Ваша проблема в предложениях 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 с помощью целочисленных клавиш. Не зная структуры вашей базы данных, я не могу дать вам гораздо больше информации об этом, но по сути это означает, что задача сопоставления элементов с параметрами выполняется во время создания или назначения параметров, а не каждый раз, когда выполняется просмотр. называется.

0 голосов
/ 23 марта 2012

Вам не нужно вызывать индексы из вида. Индексы используются для сортировки данных в таблицах и хранения их, которые будут легко доступны. Это очень помогает в улучшении производительности. Просто создайте индексы и запустите это представление и посмотрите, имеет ли оно значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...