私は、クエリを実行しているデータテーブルを30個持っており、クエリ結果を1つのメインテーブルに挿入しています。 30個の各テーブルのクエリは2〜3百万行を返すので、クエリ自体の最後までにテーブル自体には約6,000万行が必要です。テーブルへのINSERT回数が増えています
バッチスクリプトで一度に1つずつ、それぞれ独自のトランザクションで各クエリを個別に実行し、挿入後にコミットするので、トランザクションログの問題は発生しません。
私は、より多くのデータがテーブルに挿入されると、最初の数テーブルでは約5分から20番目のテーブルでは2時間以上になります。私はこれがなぜであるか把握しようとしています。
insert into maintable <columns>
select <columns> from table1
クエリは少し複雑よりもですが、私は、クエリが問題であるとは思わない:
私のクエリは、本質的です。私はクエリをテストしましたが、挿入しないと2〜3分以内に戻るので、問題ではありません。私はまた、結果を魅力的なものに挿入することをテストしました。魅力的なものに数分しかかからず、そして魅力的なものを選択してメインテーブルに挿入しました。
私が挿入しようとしているメインテーブルでは、クラスタードインデックスを削除しているため、単一のインデックスしか持たないため、問題ではありません。
問題が何であるかを診断するために私が探す必要があるものは誰にもありますか?
これはVMWare VM上にあり、データベースは同じデータストアに配置されています。これは問題なのでしょうか?
UPDATE:
メインテーブルのcreate文以下の通りです:
CREATE TABLE [dbo].[dow30_1s](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[symbol] [varchar](20) NOT NULL,
[transactionTime] [datetime] NOT NULL,
[openPrice] [decimal](20, 8) NOT NULL,
[highPrice] [decimal](20, 8) NOT NULL,
[lowPrice] [decimal](20, 8) NOT NULL,
[closePrice] [decimal](20, 8) NOT NULL,
[vol] [int] NOT NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [dow30_1s_tt] ON [dbo].[dow30_1s]
(
[transactionTime] ASC
)
INCLUDE ([closePrice],
[vol]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
おそらく –
テーブルに一意のキーまたはプライマリキーがありますか?SQL Serverがレコードを挿入する前にチェックする必要があります。おそらく統計はオフです...このupdate statisticsを実行し、挿入時間が改善されたかどうかを確認してください。ちょうどアイデア –
実行計画を一度見ましたか? –