0

データベースには、いくつかのテーブルの最終更新値を返すビューがあります。これは、これらのテーブルがアプリケーションによって変更について直接クエリされるのを防ぐためです。アプリケーションはマルチ ユーザー環境にあり、これらのテーブルは短いバーストで頻繁に更新され、一度に何時間も無視される可能性があります。

私はと呼ばれるビューを持っていますvwLastUpated

CREATE VIEW vwLastUpdated as
SELECT Tasks, Items, ListItems FROM
    (Select Max(ModifiedTime) as Tasks from tblTasks) a CROSS JOIN
    (Select Max(ModifiedTime) as Items from tblItems) b CROSS JOIN
    (Select Max(ModifiedTime) as ListItems from tblListItem) c

クライアントは、約 10 ~ 30 秒ごとにこのビューを呼び出すように構成されています (ユーザーが構成可能)。問題は、多くのクライアント (1 つのサイトで約 80) がある場合、ビューが非常に頻繁にヒットし、場合によっては時間がかかることです。実行には数ミリ秒かかりますが、更新が発生している場合は実行に 200 ~ 300 ミリ秒かかることがあります。これは、頻繁に使用しているときにフロント エンドの速度を低下させているようです。テーブルは で適切に索引付けされていModifiedTime DESCます。

これらのサイトでは SQL Express を使用している場合もあれば、フル バージョンの SQL を使用している場合もあり、別の方法でビューを設計し、エージェントを使用して共通テーブルを更新できますtblLastUpdated( 5秒。

プロセスを効率化し、SQL Express が使用されているデータベース サーバーの負荷を軽減するにはどうすればよいですか?

クライアント サイトは、SQL Server 2008 以降 (SQL 2012 まで) 上にある

4

1 に答える 1

0

次の分野の索引はありますか?

tblTasks(ModifiedTime)
tblItems(ModifiedTime)
ListItems(ModifiedTime)

これにより、かなり優れたパフォーマンスが保証されます。

その場合でも、ロックの相互作用の問題がまだある場合は、この情報を含む別のテーブルを用意することを検討してください。テーブルで直接更新/挿入を行う場合、これにはトリガーが必要になります。ストアド プロシージャで更新と挿入をラップすると、そこで変更を行うことができます。

これは基本的に、ビューをテーブルに変換し、データが変更されるたびにそのテーブルを更新します。その更新は非常に高速で、他のクエリとのやり取りは最小限に抑える必要があります。

于 2013-08-14T10:59:36.397 に答える