0

以下のストアド プロシージャを vb.net プログラムから 1 時間に 1 回自動的に実行したい

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

以下のストアドプロシージャを以下のように記述しました。

create procedure dbo.test as  
BEGIN  
   Select * from dbo.testtable  
END

そのストアド プロシージャは膨大な結果を返し、アプリケーションの読み込み時にパフォーマンスの問題を引き起こしています。

そのため、各ボタン クリック イベントで同じ結果を呼び出す代わりに、ストアド プロシージャを 1 時間ごとに呼び出し、Sessionまたはのような状態管理手法を使用してデータセットを再利用する必要がありView Stateます。

TestAspx.vbファイル - 結果を保持するSession

方法1

PrivateSub test()  
        dim ds as dataset
        ds = objtestdata.test() //From here am accessing the datalayer testdata.vb file
        Session("Testdata") = ds
    End Sub  

ドロップダウン コントロールでのセッション データの読み込み

方法2

PrivateSub loaddropdown()
            dropdowncontrol.DataSource = Session("Testdata")
            dropdowncontrol.DataBind()
end sub

Testdata.vbファイル - データ層からストアド プロシージャを呼び出す

Public Function test() As DataSet
        Dim ds As New DataSet
        Dim cmd As DbCommand

        ds.Locale = CultureInfo.InvariantCulture

            cmd = db.GetStoredProcCommand("dbo.test")

            ds = db.ExecuteDataSet(cmd)

        Return ds

End Function  

したがって、Session("TestDate")このデータセットを複数のボタンクリックの読み込みで使用できます。

以下のように、返されるデータセットをtestaspx.vbファイルで処理する必要があります

このプロセス全体を 1 時間ごとに実行するにはどうすればよいでしょうか?

この点で私を助けてください。ありがとうございました、

4

3 に答える 3

2

ストアド プロシージャは、データベース テーブル全体を取得するだけです。テーブルに膨大な数のレコードがあるという理由だけでこの操作が遅い場合は、データベースにデータをキャッシュする方法がありません。

アプリケーションに常にすべてのデータをロードする必要があることを再確認する必要があります。その場合、アプリケーションのロードは常に遅くなります。これを回避する方法はありません。

非同期スレッドを作成することはできますが、それはおそらく更新ボタンを実装して、ユーザーがいつリロードが発生するかを制御できるようにするより劣るソリューションです。

最後に、testtableがテーブルではなくビューであり、小さなデータを返すのが遅い場合は、ビューのパフォーマンスのプロファイリングと修正に集中する必要があります。

編集

アプリケーションが実行されていない場合でも、1 時間ごとに実行速度の遅いプロシージャを実行するように SQL Server エージェント ジョブを構成できます。これは、SQL Server エージェントを含まない Express エディションを使用していないことを前提としています。

EXEC sp_add_job N'MyHourlyJob'
EXEC sp_add_jobstep
    @job_name = N'MyHourlyJob',
    @step_name = N'Update_Something',
    @command = N'EXEC p_Update_Something', 
EXEC sp_add_schedule
    @schedule_name = N'HourlyJobs' ,
    @freq_interval = 1,
    @freq_type = 4,            -- every @freq_interval days
    @freq_subday_type = 8,     -- every @freq_subday_interval hours
    @freq_recurrence_factor = 1,
    @freq_subday_interval = 1
EXEC sp_attach_schedule
   @job_name = N'MyHourlyJob',
   @schedule_name = N'HourlyJobs' ;
于 2012-07-10T15:05:55.333 に答える
0

結果セットを1回だけロードし、その変更をアプリに伝達する場合は、SqlDependencyCacheがニーズに適している可能性があります。

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

于 2012-07-10T16:17:40.487 に答える
0

使用しているフレームワークのバージョンがわかりません。ただし、.Net4 で MemoryCache を使用したり、.Net2 で Http キャッシュを使用したりできます。

.NET 4 で実行している場合は、MemoryCache を使用してジョブを実行できます。

public static class MyBigDataCache
{
    private const string RegionName= "myBigDataRegion";

    // key could by the username...
    public static DataTable GetMyData(string key)
    {
        // try the cache
        var data = (DataTable) MemoryCache.Default.Get(key, RegionName);

        // nothing in cache...
        if (data == null)
        {
            // read from db
            data = ReadDataFromDb(key);

            // create the cache policy to evict this key after 1 hour.
            var policy = new CacheItemPolicy()
                {
                    AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(60)
                };

            // add to cache
            MemoryCache.Default.Add(new CacheItem(key, data, RegionName), policy);
        }

        return data;
    }

    private static DataTable ReadDataFromDb(String key)
    {
        // load your data here...
        return null;
    }
}

.NET2 で実行している場合は、Http キャッシュを使用できます。例:

HttpContext.Current.Cache.Add(key, data, null, DateTime.Now.AddMinutes(60), Cache.NoSlidingExpiration, CacheItemPriority.Default,
                                          null);
于 2012-07-10T15:42:38.170 に答える