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