C# Web アプリケーションから挿入クエリを実行しようとしています。SQL Server Management Studio からクエリを実行すると、挿入クエリが完了するまでに約 5 分かかります。アプリケーションから実行すると、30 分 (秒ではなく分) 後にタイムアウトになります。
VS デバッガーから実際の SQL ステートメントを取得し、Mgmt Studio から実行したところ、正常に動作しました。
これはすべて、本番環境ではなく、私の開発環境から実行されています。クエリの進行中は、他の SQL Server アクティビティはありません。開発には SQL Server 2008 R2 を使用しています。MS VS 2010 Express、Asp.Net 4.0。SQL Server 管理スタジオ 10.
答えられなかったこれと同様の質問があります: SQL server timeout 2000 from C# .NET
dbcc useroptions からの SET オプションは次のとおりです。
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
textsize と 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