2016-04-15 4 views
0

У меня сложный запрос в .NET. Пожалуйста, смотрите запрос (простой запрос для объяснения целей) ниже:Параметрированный запрос слишком медленный

SELECT * FROM Person WHERE Name='Ian' AND DateOfBirth='1961-04-04' 

и это:

SELECT * FROM Person WHERE [email protected] AND [email protected] 

таблица индексируется (имя и дата рождения).

Первый запрос занимает часть секунды для запуска .NET. Второй запрос занимает около 48 секунд. Это как-то связано с планом исполнения? Есть ли что-нибудь, что я могу сделать, чтобы заставить SQL Server воссоздать план выполнения?

Я видел этот вопрос: https://dba.stackexchange.com/questions/530/how-do-you-clear-out-all-old-query-plans-from-within-microsoft-sql-server. Однако это больше для хранимых процедур.

+0

Я не уверен, как вы ожидаете, что мы точно диагностируем проблему, если вы не показываете нам настоящий код или код, способный воспроизвести проблему. – Becuzz

+0

@ Becuzz, Гордон Линдофф смог точно диагностировать проблему. – w0051977

ответ

5

Во-первых, вам нужен составной индекс на Person(Name, DateOfBirth), а не на два индекса (столбцы могут быть в любом порядке).

Во-вторых, это, вероятно, связано с планом выполнения.

Я собираюсь предложить RECOMPILE вариант:

SELECT p.* 
FROM Person p 
WHERE Name = @Ian AND DateOfBirth = @DateOfBirth 
OPTION (RECOMPILE); 

Что может произойти с параметризованными запросами является то, что план выполнения кэшируется в первый раз, когда он запускается - но что план выполнения не может быть лучшим для последующих вызовов.

Если это не сработает, то проблема может быть типами данных, поскольку несовместимость типов данных может помешать использованию индексов. Убедитесь, что типы данных и одинаковы. Возможно, вам потребуется указать cast() параметры соответствующего типа и/или использовать COLLATE.

+0

Спасибо за быстрый ответ. Это сработало. Я отвечу, когда это позволит. +1. – w0051977

+0

Возможно, вам не нужен индекс в любом порядке. Сначала поставьте наиболее избирательный индекс. –

Смежные вопросы