2012-02-22 24 views
0

リンクサーバー上のSQL Serverテーブルを結合するビューがあります。リンクされたサーバーには、ビューにインデックスを作成することができないという意味の制限があり、選択を行っているにもかかわらず、昨夜データベースをロックしたストアドプロシージャがあります。ストアドプロシージャは、(私はSELECT文の両方から十列を省略さき).NetTiersによって生成される:データベース間の照会をクエリするストアドプロシージャのロックを緩和する方法

CREATE PROCEDURE [AbnormalReadingSource_Get] 
(
    @WhereClause varchar (2000) , 
    @OrderBy varchar (2000) , 
    @PageIndex int , 
    @PageSize int 
) 
AS 
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
BEGIN 
    DECLARE @PageLowerBound int 
    DECLARE @PageUpperBound int 

    -- Set the page bounds 
    SET @PageLowerBound = @PageSize * @PageIndex 
    SET @PageUpperBound = @PageLowerBound + @PageSize 

    IF (@OrderBy is null or LEN(@OrderBy) < 1) 
    BEGIN 
     -- default order by to first column 
     SET @OrderBy = '[Result]' 
    END 

    -- SQL Server 2005 Paging 
    declare @SQL as nvarchar(4000) 
    SET @SQL = 'WITH PageIndex AS (' 
    SET @SQL = @SQL + ' SELECT' 
    IF @PageSize > 0 
    BEGIN 
     SET @SQL = @SQL + ' TOP ' + convert(nvarchar, @PageUpperBound) 
    END 
    SET @SQL = @SQL + ' ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ') as RowIndex' 
    SET @SQL = @SQL + ', [Result]' 
    SET @SQL = @SQL + ' FROM [AbnormalReadingSource]' 
    IF LEN(@WhereClause) > 0 
    BEGIN 
     SET @SQL = @SQL + ' WHERE ' + @WhereClause 
    END 
    SET @SQL = @SQL + ') SELECT' 
    SET @SQL = @SQL + ' [Result],' 
    SET @SQL = @SQL + ' FROM PageIndex' 
    SET @SQL = @SQL + ' WHERE RowIndex > ' + convert(nvarchar, @PageLowerBound) 
    IF @PageSize > 0 
    BEGIN 
     SET @SQL = @SQL + ' AND RowIndex <= ' + convert(nvarchar, @PageUpperBound) 
    END 
    exec sp_executesql @SQL 

    -- get row count 
    SET @SQL = 'SELECT COUNT(*) as TotalRowCount' 
    SET @SQL = @SQL + ' FROM [AbnormalReadingSource]' 
    IF LEN(@WhereClause) > 0 
    BEGIN 
     SET @SQL = @SQL + ' WHERE ' + @WhereClause 
    END 
    exec sp_executesql @SQL 

END 

データベーストランザクション分離レベルがREAD COMMITTEDように、ストアドプロシージャに分離レベルを設定することは必要ではなくなっていますストアドプロシージャを生成するために使用された.NetTiersテンプレートで。ロックが発生しないように、readpastヒントを使用できますか? readpastを使用するときに、他のヒントを提供する必要はありますか?

答えて

2

READPASTを試すこともできますが、何かが一時的にロックされていると、結果セットでレコードが欠落する可能性があるため、「ダーティー」な読み取りは許可されません。

同様にあなたがあなたのselect文を試みることができる:WITH(NOLOCK)

NOLOCKは「汚い」データを読み込みますが、その後、あなたはそれがロールバックされる危険性があります。

どちらもブロックされません。両方とも賛否両論あります。

この記事では明確に役立つはず:あなただけREAD UNCOMMITTEDにトランザクション分離レベルを設定していない理由を
http://www.techrepublic.com/article/using-nolock-and-readpast-table-hints-in-sql-server/6185492

1

私が知っているREADPASTを使用してか、NOLOCK

であなたはかなり同じ結果になりますあなたはプロシージャが.NetTiersによって生成されたと言ったが、あなたはあなたが分離レベルを変更することもできると仮定しているので、あなたはクエリヒント(readpast)を追加することができると述べた。

+0

おかげ - このケースでは、私が一緒に行くつもりですreadpastでも、私はあなたの提案を使用することができたことを感謝します。 –

2

実行SQLプロファイラこのクエリと組み合わせて、データベースエンジンチューニングアドバイザに入力します。これを解消するか、指標を改善することができれば、分離レベルを変更しないでください。

リンクサーバーでビューを作成することはできますが、これらのリンクサーバーはであり、インデックス付きビューではクロスデータベースクエリが許可されていない必要があります。

おそらく、この手順はビューでは実行しないでください。

http://msdn.microsoft.com/en-us/library/ms191432.aspx

グレートロック記事

http://support.microsoft.com/kb/75722 http://support.microsoft.com/kb/323630

マイナーなオーバーヘッドが発生しますものはシステムストアドプロシージャのために予約されている、あなたのストアドプロシージャ内の単語SPを使用しないでください。

カーソルは不良ですが、索引付けの方が優れています。チューニング・アドバイザは自動的にスキップします。つまり、ビューを完全に活用して回避する必要があります。

SSIS SMTPタスク経由で不在時にこのタスクが失敗した場合、あなたとあなたの共同マネージャーが両方とも認識するように、このプロセスに関する障害アラートを作成します。

"他のサーバーからデータを繰り返し取得するには、リンクサーバーを作成し、OPENQUERY関数を使用するか、または4つの部分からなる名前を使用します。T-SQLに準拠していない場合は、インポート/将来の使用のためにSSISパッケージとして保存することができます。 - SQL Server MVP Pinal Dave

ロックについて、あなたはデッドロックを解決するために使用できる潜在的なデッドロック

代表的な方法としては、

  • は、インデックスを追加および削除します。
  • インデックスヒントを追加しています。
  • 同様のパターンでリソースにアクセスするようにアプリケーションを変更します。
  • トリガーのようなトランザクションからアクティビティを削除します。
  • できるだけ短い取引を維持する。汚いからトランザクションを保護する使ってコミットされていないデータ変更の読み出しながら

    は、SQL Serverで、あなたはまた、競合をロック最小限に抑えることができ、次のいずれか

    • ONに設定READ_COMMITTED_SNAPSHOTデータベースオプションを使用してREAD COMMITTED分離レベル
    • SNAPSHOT分離レベル。ロックを中心とした

負荷のSQLプロファイラは、データベースエンジンチューニングアドバイザーにそれを養う、と提案を見直し、特にそのDBのためのデッドロックやスクリプトを開始します。

脚注http://support.microsoft.com/kb/832524

[[1]:http://support.microsoft.com/kb/832524

http://www.codeproject.com/Articles/42547/SQL-SERVER-How-To-Handle-Deadlock

前にStackOverflowロック質問ディエゴhow to solve deadlock problem?

関連する問題