2

ライブ サーバー上の sql azure データベースに奇妙な問題があります。MVC コントローラーは、「待機操作がタイムアウトしました」および Sqleexpection (0x80131904): タイムアウトが期限切れになりました」というエラーを返しています。

これは、特に 1 つの SQL ストアド プロシージャで発生しています。プログラムは、SMSS 2012 を使用してデータベースに対して同じパラメーターでストアド プロシージャを実行すると、正常に実行され、2 秒以内に戻ります。

これにより、ストアド プロシージャに問題がないことがわかりました。

以下のようにストアドプロシージャを呼び出しています。

List<FileFolderItem> folders = new List<FileFolderItem>();

using (DFModel db = new DFModel())
{
    folders.AddRange(
        db.GetFolderStructure(companyId, (clientid ?? companyId), folderId, currentUser.df_userId).Select(x => new FileFolderItem
        {
            Name = x.name,
            Id = x.id,
            Flags = "USER_FOLDER",
            TotalFiles = x.Files.Value,
            TotalSize = x.Size.Value
        }).ToList<FileFolderItem>()
    );

    return folders;
}

データベースのバックアップを作成し、別の新しいデータベースと同じ sql azure インスタンスで復元し、アプリケーション接続をバッ​​クアップ db にポイントすると、アプリケーションが動作するため、さらにテストを行いました。

この問題のトラブルシューティング方法がわかりません。SQL Azure インスタンスを再起動する方法がありません。

どんな助けでも大歓迎です。

ありがとう

ここに画像の説明を入力

2013 年 3 月 13 日編集

さらに調査した結果、サブプロシージャ GetFolderTotalSize から呼び出されたテーブル値関数 (getfilesbyclaims) に問題があるようです。この機能は完全にはサポートされていません。奇妙なことは、アプリケーションが約 4 週間前に公開され、この問題が昨日の午後 4 時に突然始まったことです。

CREATE PROCEDURE [dbo].[GetFolderStructure]
    @companyid int, 
    @clientid int, 
    @folderid int, 
    @personid int
AS
SELECT 
        fd.id, 
        fd.name,        
        dbo.getfoldertotalfiles(@companyid, @clientid, fd.id, @personid) AS Files,
        --0 as Files,
        dbo.getfoldertotalsize(@companyid, @clientid, fd.id, @personid) as Size
        --0 as Size
FROM folders fd
WHERE fd.companyid = @companyid
AND fd.root_id = @folderid
AND (fd.hidden IS NULL OR fd.hidden = 0)

サブプロシージャ - GetFolderTotalFiles

ALTER FUNCTION [dbo].[GetFolderTotalSize]
(
    @companyid int, 
    @clientid int, 
    @folderid int,
    @personid int
)
RETURNS INT
AS
BEGIN
    DECLARE @size int;

    DECLARE @tblFiles TABLE (
        Id uniqueidentifier not null,
        CompanyId int,
        folderid int,
        contentLength bigint    
    );

    INSERT INTO @tblFiles(id, companyid, folderid, contentlength)
    SELECT * FROM dbo.getfilesbyclaims(@clientid, @personid);

    WITH Folder_CTE as (
    select fs.* FROM folders AS fs
    where companyid = @companyid
    AND id = @folderid
    UNION ALL
    SELECT f.* FROM folders f
    INNER JOIN Folder_CTE fcte ON fcte.id = f.root_id)

    SELECT @size = ISNULL(SUM(f.contentlength), 0) FROM folder_cte fd
    INNER JOIN @tblFiles f ON f.folderid = fd.id
    where f.companyid = @clientid

    return @size;
END

GO
4

0 に答える 0