Я пытаюсь получить запрос на вставку для запуска из моего веб-приложения С#. Когда я запускаю запрос из SQL Server Management Studio, запрос на ввод занимает около пяти минут. При запуске из приложения он истекает через тридцать минут (да минут, а не секунд).
Я захватил фактический оператор SQL из отладчика VS и запустил его из Mgmt Studio, и он отлично работает.
Все это выполняется из моей среды разработки, а не из рабочей среды. Во время выполнения запроса нет других действий SQL Server. Я использую SQL Server 2008 R2 для разработки. MS VS 2010 Express, Asp.Net 4.0. SQL Server Mgmt Studio 10.
Есть аналогичный вопрос, на который никогда не отвечали: SQL Server timeout 2000 из С#.NET
Здесь параметры SET: dbcc useroptions
Option MgtStudio Application
----------------------- -------------- --------------
textsize 2147483647 -1
language us_english us_english
dateformat mdy mdy
datefirst 7 7
lock_timeout -1 -1
quoted_identifier SET SET
arithabort SET NOT SET
ansi_null_dflt_on SET SET
ansi_warnings SET SET
ansi_padding SET SET
ansi_nulls SET SET
concat_null_yields_null SET SET
isolation level read committed read committed
Только textize и arithabort различаются.
Любые идеи, почему существует такая разница во времени выполнения запроса и что я могу сделать, чтобы сузить эту разницу?
Я не уверен, насколько полезен, в том числе и запрос, тем более, что было бы слишком сложно включить схему. Во всяком случае, вот оно:
INSERT INTO GeocacherPoints
(CacherID,
RegionID,
Board,
Control,
Points)
SELECT z.CacherID,
z.RegionID,
z.Board,
21,
z.Points
FROM (SELECT CacherID,
gp.RegionID,
Board=gp.Board + 10,
( CASE
WHEN (SELECT COUNT(*)
FROM Geocache g
JOIN GeocacheRegions r
ON ( r.CacheID = g.ID )
WHERE r.RegionID = gp.RegionID
AND g.FinderPoints >= 5) < 20 THEN NULL
ELSE (SELECT SUM(y.FinderPoints) / 20
FROM (SELECT x.FinderPoints,
ROW_NUMBER() OVER (ORDER BY x.FinderPoints DESC, x.ID) AS Row
FROM (SELECT g.FinderPoints,
g.ID
FROM Geocache g
JOIN Log l
ON ( l.CacheID = g.ID )
JOIN Geocacher c
ON ( c.ID = l.CacherID )
JOIN GeocacheRegions r
ON ( r.CacheID = g.ID )
WHERE YEAR(l.LogDate) = @Year
AND g.FinderPoints >= 5
AND c.ID = gp.CacherID
AND r.RegionID = gp.RegionID) x) y
WHERE y.Row <= 20)
END ) Points
FROM GeocacherPoints gp
JOIN Region r
ON r.RegionID = gp.RegionID
WHERE gp.Control = 21
AND r.RegionType IN ( 'All', 'State' )
AND gp.Board = @Board - 10) z
WHERE z.Points IS NOT NULL
AND z.Points >= 1