У меня есть запрос, который выполняется через LINQ to SQL. Запрос выглядит так:
exec sp_executesql N'
SELECT DISTINCT [t2].[ID],...
FROM
Table1 AS [t0]
INNER JOIN Table2 AS [t1] ON [t0].[Table1ID] = [t1].[Table1ID]
INNER JOIN Table3 AS [t2] ON [t2].[Table2ID] = [t0].[Table2ID]
WHERE
([t2].[Visible] = @p0)
AND ([t1].[AncestorID] IN (@p1,...,@p277))',N'@p0 int,...,@p277 int',@p0=1,...@p277=2875
Как видите, это в основном запрос в предложении с 277 параметрами. Используя exec и передавая параметры, как указано выше, запрос занимает 20 секунд .
Если я извлекаю запрос из вызова exec и запускаю его «нормально», это займет меньше , чем одна секунда . Вот запрос:
DECLARE @p0 int;
...
DECLARE @p277 int;
SET @p0=1;
...
SET @p277=287;
SELECT DISTINCT [t2].[ID],...
FROM
Table1 AS [t0]
INNER JOIN Table2 AS [t1] ON [t0].[Table1ID] = [t1].[Table1ID]
INNER JOIN Table3 AS [t2] ON [t2].[Table2ID] = [t0].[Table2ID]
WHERE
([t2].[Visible] = @p0)
AND ([t1].[AncestorID] IN (@p1,...,@p277))
Третий тест, когда я заключаю второй запрос в exec, он работает мгновенно все еще. Таким образом, проблема заключается в передаче параметров в вызове exec.