0

以下のクエリで長時間の DateTime を指定すると、タイムアウトの問題が発生しました (クエリは c# アプリケーションから実行されます)。テーブルには、ID に非クラスター化インデックス (主キーではない) を持つ 3,000 万行がありました。

主キーがないことがわかったので、最近IDを主キーとして更新しましたが、タイムアウトになりません。以下のクエリで将来のために複数のキーにインデックスを作成し、このテーブルから非クラスター化インデックスを削除して複数の列に作成する場合、誰でも助けてもらえますか? データは急速に増加しており、パフォーマンスの改善が必要です

select 
ID, ReferenceNo, MinNo, DateTime, DataNo from tbl1
where 
DateTime BETWEEN '04/09/2013' AND '20/11/2013'
and  ReferenceNo = 4 and MinNo = 3 and DataNo = 14 Order by ID

これは作成スクリプトです

CREATE TABLE [dbo].[tbl1](  [ID] [int] IDENTITY(1,1) not null,  [ReferenceNo] [int] not null,   [MinNo] [int] not null,     [DateTime] [datetime] not null,     [DataNo] [int] not null,  CONSTRAINT [tbl1_pk] PRIMARY KEY CLUSTERED  ([ID] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS 
= ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY]
4

2 に答える 2

1

データベースとその使用方法について詳しく知らなければ、どのインデックスを使用すべきかを判断するのは困難です。

ID 列をクラスター化インデックスに変更することができます。ID が ID 列の場合、新しいデータを挿入する際にページが分割されることはほとんどありません。ただし、テーブルを再構築する必要があり、データベースの使用状況によっては問題になる場合があります。ダウンタイムが発生します。

カバリング インデックスが必要な場合は、次のようになります。

CREATE NONCLUSTERED INDEX [MyCoveringIndex] ON tbl1
(
    [ReferenceNo] ASC,
    [MinNo] ASC,
    [DataNo] ASC,
    [DateTime ] ASC
)

クラスター化されたインデックスに既に含まれているため、ID を列として含める必要はありません (クラスター化されたインデックス列は、他のすべてのインデックスに含まれます)。ただし、これは大量のスペースを使い果たします (上記の列が int 型と datetime 型の場合、1 GB の範囲のどこか)。また、(ほとんどの場合) テーブルの挿入、更新、および削除のパフォーマンスに悪影響を及ぼします。

Enterprise Edition の SQL サーバーを使用している場合は、オンライン モードでインデックスを作成できます。それ以外の場合はすべて、インデックスの作成中にテーブルがロックされます。

また、テーブルに対して行われた他のクエリを知ることも困難です。インデックス内の列の順序を微調整して、他のクエリと一致させることができます。

于 2013-11-21T10:41:19.053 に答える
0

すべてのフィールドにインデックスを付けるのが最速ですが、大量のスペースを浪費する可能性があります。データはおそらく長期間にわたって均等に分散されているため、日付インデックスは最小のストレージ容量コストで最大のメリットを提供すると思います。MIN() MAX() の日付が互いに近い場合、これはそれほど効果的ではありません。

CREATE NONCLUSTERED INDEX [IDX_1] ON [dbo].[tbl1] (
    [DateTime] ASC
)
GO

補足として、SSMSE の「Display Estimated Execution Plan」を使用すると、DB がデータを取得するために何をする必要があるかがわかります。欠落しているインデックスを提案し、CREATE INDEX ステートメントも提供します。これらの提案は非常に無駄になる可能性がありますが、何に時間がかかっているかがわかります。このオプションは、標準ツールバーの [実行] の右にある 4 つのアイコンにあります。

于 2013-11-22T14:13:59.603 に答える