1

2 億 5000 万のレコード (一意の 15 桁の数字。クラスタ化された一意のインデックス列) を持つテーブルがあり、1 日平均で少なくとも 70 万から 90 万のリクエストでクエリされます。

このテーブルにアクセスする複数のアプリケーションがあります。各アプリケーションは、500,000 データをこの 2 億 6000 万レコードと比較しようとします。

この大きなテーブルにさらにデータを追加するアプリケーションがあり、実際には他のアプリケーションのクエリが遅くなります。

クエリのパフォーマンスを改善するにはどうすればよいでしょうか? このテーブルを維持するにはどうすればよいでしょうか。分割しますか? 環境: Win 2K8R2、SQL 2K8R2、64GB RAM、デュアル プロセッサ 8 コア

4

2 に答える 2

0

複数のアプリケーションがデータを比較しようとしているだけの場合、これらはテーブルに書き込んでいないと思います。レコードのキャッシュも役立つはずです。また、残念ながらSQLサーバーが提供しないシャーディングと呼ばれる手法もあります。しかし、SQLServerにそのような機能を提供するcodeplex上のライブラリがあります。基本的に、データベースの負荷を分散しようとします。

私はそれをテストしていませんが、試してみる価値があります。必要に応じて、ここで確認できますhttp://enzosqlshard.codeplex.com/

于 2013-02-18T08:31:56.373 に答える
0

1.一時テーブルを使用する

関心のあるデータのサブセット(行と列)に一時テーブルを作成します。一時テーブルは、元のソーステーブルよりもはるかに小さく、(必要に応じて)簡単にインデックスを作成できる必要があります。

一時テーブルを作成するには、次のようなコード(テストされていません)を使用できます。

-- copy records from last month to temporary table
INSERT INTO
   #my_temporary_table
SELECT
    *
FROM
    er101_acct_order_dtl WITH (NOLOCK)
WHERE 
    er101_upd_date_iso > DATEADD(month, -1, GETDATE())

-- run other queries on temporary table (which can be indexed)
SELECT TOP 100
    * 
FROM 
    #my_temporary_table 
ORDER BY 
    er101_upd_date_iso DESC

長所:

データのサブセットに対して簡単に実行できます。管理が簡単-それは一時的なものであり、テーブルです。ビューのようなシステム全体のパフォーマンスには影響しません。一時テーブルにインデックスを付けることができます。短所:

これはデータのスナップショットですが、アドホッククエリにはおそらくこれで十分です。

2.ビューを作成します

上記と同様ですが、一時テーブルの代わりにビューを作成します。

関心のあるデータのサブセットに対してビューまたはインデックス付きビューを作成し、ビューに対してクエリを実行できます。これには、テーブル全体よりもはるかに小さいデータの興味深いサブセットのみが含まれている必要があります。

長所:

簡単にできます。ソースデータは最新です。短所:

定義されたデータのサブセットに対してのみ可能です。更新率の高い大きなテーブルでは非効率になる可能性があります。管理はそれほど簡単ではありません。システム全体のパフォーマンスに影響を与える可能性があります。すべての列を選択する大きなテーブルでスタークエリ(SELECT * FROM)を実行するのは良いことではありません...

大きな列(長い文字列など)がある場合、ディスクからそれらを読み取り、ネットワークを通過するのに多くの時間がかかります。

*を本当に必要な列名に置き換えようとします。

または、すべての列が必要な場合は、クエリを次のように書き直してみてください。

;WITH recs AS (
    SELECT TOP 100 
        id as rec_id -- select primary key only
    FROM 
        er101_acct_order_dtl 
    ORDER BY 
        er101_upd_date_iso DESC
)
SELECT
    *
FROM
    er101_acct_order_dtl
WHERE 
    id = rec.rec_id
ORDER BY 
    er101_upd_date_iso DESC 

ダーティリード

クエリを高速化できる最後のことは、テーブルヒントWITH(NOLOCK)を使用したダーティ読み取りを許可することです。

ヒントの代わりに、トランザクション分離レベルを設定して、コミットされていないものを読み取ることができます。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
于 2013-02-18T08:37:28.170 に答える