2012-01-13 4 views
0

これまでは、ストアドプロシージャを使用してレコードセットを返す古いASPページ(通常は< 2000行)からこのエラーが発生しました。ストアドプロシージャがASPページで断続的にタイムアウトします

ODBCドライバ用

のMicrosoft OLE DBプロバイダー(0x80040E31) [Microsoft]の[ODBC SQL Serverドライバー]タイムアウトが

私は、サーバー上でSPを実行すると、それは問題なく動作しますが、ASPとそれだけでA与え期限切れタイムアウトが切れました。

SPを再コンパイルすると、問題が修正され、ASPはもう一度ASPで正常に動作します。しかし、それから数日後/週後、同じSP/ASPか別の問題のいずれかから同じ問題が発生します。ソーステーブルとASPはまったく変更されていません。

私は困惑しています。

サンプルSP:

USE [DB-Name] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER Procedure [dbo].[MY_StoredProcedure] 
    @Filter varchar(50) = null, 
    @SortOrder bit = 1, 
    @SortField varchar(50) = 'MyCol1', 
    @Page int = 1, 
    @RecordsPerPage int = 20 
AS 
BEGIN 
    SET NOCOUNT ON 
    CREATE TABLE #TempTable(RowID int IDENTITY,Col1 int,Col2 varchar(20),Col3 datetime) 
    INSERT INTO #TempTable 
    SELECT Col1, Col2, Col3 FROM [DB-Table] 
    WHERE 
     @Filter is null OR (
      Col1 LIKE '%' + @Filter + '%' 
      OR Col2 LIKE '%' + @Filter + '%' 
      OR Col3 LIKE '%' + @Filter + '%' 
     )  
    ORDER By 
     CASE WHEN @SortField = 'MyCol1' AND @SortOrder = 1 THEN Col1 END ASC, 
     CASE WHEN @SortField = 'MyCol1' AND @SortOrder = 0 THEN Col1 END DESC, 
     CASE WHEN @SortField = 'MyCol2' AND @SortOrder = 0 THEN Col2 END DESC, 
     CASE WHEN @SortField = 'MYCol2' AND @SortOrder = 1 THEN Col2 END ASC, 
     CASE WHEN @SortField = 'MyCol3' AND @SortOrder = 1 THEN Col3 END ASC, 
     CASE WHEN @SortField = 'MyCol4' AND @SortOrder = 0 THEN Col3 END DESC 

    -- Find out the first and last record we want 
    DECLARE @FirstRec int, @LastRec int 
    SELECT @FirstRec = (@Page - 1) * @RecordsPerPage 
    SELECT @LastRec = (@Page * @RecordsPerPage + 1) 

    -- Now, return the set of paged records, plus, an indiciation of if we have more  records or not! 
    SELECT *,TotalRecords=(SELECT COUNT(RowID) FROM #TempTable),MoreRecords=(SELECT  COUNT(RowID) FROM #TempTable TI WHERE TI.RowID >= @LastRec) 
    FROM #TempTable 
    WHERE 
     RowID > @FirstRec AND RowID < @LastRec 

    DROP TABLE #TempTable 
    -- Turn NOCOUNT back OFF 
    SET NOCOUNT OFF 
END 
GO 

答えて

3

あなたは、パラメータスニッフィングの結果として誤ってキャッシュされたクエリプランのような音を説明したもの。

統計情報とインデックスが最新のものであることを確認することで回避できます。

問題のストアドプロシージャを投稿することをお勧めします。

正規の参照は次のとおりです。

SELECT Col1, Col2, Col3 FROM [DB-Table] 
WHERE 
    @Filter is null OR ( 
     Col1 LIKE '%' + @Filter + '%' 
     OR Col2 LIKE '%' + @Filter + '%' 
     OR Col3 LIKE '%' + @Filter + '%' 
    )   
ORDER By 
    CASE WHEN @SortField = 'MyCol1' AND @SortOrder = 1 THEN Col1 END ASC, 
    CASE WHEN @SortField = 'MyCol1' AND @SortOrder = 0 THEN Col1 END DESC, 
    CASE WHEN @SortField = 'MyCol2' AND @SortOrder = 0 THEN Col2 END DESC, 
    CASE WHEN @SortField = 'MYCol2' AND @SortOrder = 1 THEN Col2 END ASC, 
    CASE WHEN @SortField = 'MyCol3' AND @SortOrder = 1 THEN Col3 END ASC, 
    CASE WHEN @SortField = 'MyCol4' AND @SortOrder = 0 THEN Col3 END DESC 
OPTION (OPTIMIZE FOR (@Filter UNKNOWN)) 

これは、パラメータ@Filterのためのスニッフィングパラメータを排除し、平均選択性を使用するようにSQL Serverに指示します:SQL Server 2008ではSlow in the Application, Fast in SSMS?

以降あなたはOPTIMIZE FORを利用することができます値(統計に基づく)。

+0

この問題が発生しているのは1つのSPだけではありませんが、私が知っている限り、問題を抱えているのは私が今投稿したサンプルコードに似ています。リンクのおかげで...今日の私のための就寝時の読書のビット:) –

+0

その動的フィルタはおそらく問題です。フィルタの最も一般的な形式で初めて呼び出す場合は、フィルタのより一般的な値に対してうまく機能しないクエリプランをキャッシュすることができます。この記事では、あなたが持っているオプションについて説明します(SQLサーバのバージョンに依存します)。 –

+0

@Mitchは遊びを持ち、何が起こるかを見てくれます。私たちは2008年に指を踏み越え、問題を解決します。ムチャス・グラシアス。 –

関連する問題