Принудительная подсказка для индексации из структуры сущностей в SQL Server - PullRequest
0 голосов
/ 01 марта 2011

Я звоню SQL Server 10 из Entity Framework в C # и хочу получить подсказку запроса в запросе.База данных имеет индексы, которые обычно работают из SQL, запускаемого в Management Studio, но при вызове команды из C # с использованием Entity Framework в Visual Studio планировщик запросов выбирает полное сканирование, когда индекс уже существует.

Ясоздание динамических предикатов для запроса данных в следующей форме:

data.attributeText = data.vegaDB.attributeText.AsExpandable().Where(parentPredicate.Compile()).ToList();

, где parentPredicate - это динамически генерируемый эквивалент:

(parentID = p1) AND (attributeName = 'name OR ... ')          

, из которого создается план запроса SQL Server:

SELECT 
[Extent1].[attributeID] AS [attributeID],  
[Extent1].[parentID] AS [parentID],  
[Extent1].[typeID] AS [typeID],  
[Extent1].[attributeName] AS [attributeName],  
[Extent1].[attributeData] AS [attributeData]  
FROM [dbo].[attributeText] AS [Extent1]

Таким образом, замена [Extent1] на индекс [IX_parentID], который использует прямой вызов sql, какой-то дополнительной командой, которая делает подсказку запроса при первоначальном вызове c #, может показаться решением.Я осмотрелся вокруг, но безуспешно.Есть идеи, как сформулировать вопрос?

Как вы думаете, это правильное решение?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2012

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

0 голосов
/ 01 марта 2011

Запустите трассировку SQL, чтобы узнать, что SQL-запрос на самом деле генерируется для этого оператора.

Ваш предикат или эквивалент действительно отображается в запросе , как видит SQL Server ?

Если он появляется, вам нужно запустить , который запрос через мастер настройки индекса или аналогичный.

Если нет, то это ваша проблема - это будет означать, что Entity Framework загружает всю таблицу в память и применяет сам предикат.

Обновлено Я почти уверен, что это именно то, что происходит: AsExpandable () не может преобразовать ваш предикат в SQL, поэтому он генерирует код для чтения всей таблицы, а затем применяет предикат к возвращаемым данным.

Решение состоит в том, чтобы прекратить использование AsExpandable и использовать вместо этого AsQueryable. Единственная причина использовать AsExpandable - это то, что AsQueryable не предлагает необходимую вам функциональность, и я не думаю, что это так.

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