SQL-запрос замедляется при выполнении с помощью LINQ (с использованием полнотекстового поиска)

#linq-to-sql #full-text-search

#linq-to-sql #полнотекстовый поиск

Вопрос:

У меня есть запрос, который генерируется LINQ и генерирует ошибку тайм-аута. Но когда я запускаю сгенерированный запрос в SQL server management studio, он выполняется менее чем за одну секунду.

Вот запрос:

 exec sp_executesql N'SELECT COUNT(*) AS [value]
FROM [dbo].[Document] AS [t0]
INNER JOIN [dbo].[Document_Search_order_nummer](@p0) AS [t1] ON [t0].[DocumentID] = [t1].[Key]
LEFT OUTER JOIN [dbo].[DocType] AS [t2] ON [t2].[Id] = [t0].[DocumentTypeIDOut]
LEFT OUTER JOIN [dbo].[DocTypeFormat] AS [t3] ON [t3].[Id] = [t2].[FormatId]
LEFT OUTER JOIN [dbo].[DocTypeType] AS [t4] ON [t4].[Id] = [t2].[TypeId]
INNER JOIN [dbo].[OriginalDocument] AS [t5] ON [t5].[OriginalDocID] = [t0].[OriginalDocID]
INNER JOIN [dbo].[User] AS [t6] ON [t6].[User_ID] = [t0].[DocumentFrom]
INNER JOIN [dbo].[User] AS [t7] ON [t7].[User_ID] = [t0].[DocumentTo]
WHERE ([t0].[DocumentID] <> @p1)',N'@p0 nvarchar(4000),@p1 int',@p0=N'"* 11110001 *" ',@p1=270675
  

Ниже приведен журнал из профилировщика SQL server:

Использование LINQ:

Eventclass= RPC: завершено
ApplicationName = Поставщик данных .Net SqlClient
CPU = 12625
Чтения = 1137844
Записи = 0
Продолжительность = 29989

Использование SQL Server Management Studio:

Eventclass= SQL:BatchCompleted
ApplicationName= Microsoft SQL Server Management Studio — Запрос
Процессор = 78
Чтения = 31645
Записи = 0
Длительность = 99

В чем причина такой большой разницы в производительности при равном запросе и как я могу решить эту проблему?

Комментарии:

1. Нет никого, кто мог бы направить меня на правильный путь? 🙁

2. Пожалуйста, посмотрите здесь: mssqltips.com/sqlservertip/1304 /…

Ответ №1:

Однажды у нас была точно такая же проблема.

Одной из возможных причин может быть несоответствие параметров типу, которое вызывает это.

Но в нашем случае это не было проблемой. Оказалось, что в некоторых случаях выполнение запроса просто занимает больше времени. Итак, мы изолировали запрос и запустили его через ADO.Класс NET SqlCommand . Хотите верьте, хотите нет, но когда мы добавили дополнительные пробелы между командами sql, запрос стал выполняться намного быстрее.

Итак, мы взяли запрос и создали представление на его основе. Это решило нашу проблему.