私はMS SQLを使用しており、同じテーブルに対して異なる基準でいくつかのクエリを実行する必要があります。最初は元のテーブルで各クエリを実行しましたが、それらはすべて何らかのフィルタリング(つまり、日付、ステータス)を共有しています。これには長い時間がかかりました(約2分)。
データ行に重複があり、すべてのインデックスがクラスタリングされていません。私の基準では4列のみに関心があり、結果はすべてのクエリについてカウントのみを出力するはずです。
:列は、必要に応じてTABLE
、FIELD
、AFTER
、DATE
、とのそれぞれにインデックスがあるDATE
とはTABLE
。
必要なフィールドのみを含む一時テーブルを作成した後、1:40分になりましたが、それでも非常に悪いです。
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
これを実行->(216598行が影響を受けます)
すべてのクエリが日付範囲に依存しているわけではないため、クエリに含めませんでした。問題は、挿入するのに1分をはるかに超える時間がかかることです。上記の挿入には1:19分かかりました
私はいくつかのクエリに対してこのようなものを実行したいと思います:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
これは、選択よりも挿入の問題ですが、tempには元のテーブルよりも行がはるかに少ないため、テーブルを何度も通過するよりも優れている場合があります。
これをどのように最適化できますか?
編集
ソートIDを削除しましたが、問題は主に選択ではなく挿入にあると考えました。それは推測でした。
一意のフィールドまたは行がないため、どのインデックスにも一意を作成できません。
SQL Server 2012を使用しています。
テーブル情報:これはヒープであり、次のスペース使用量があります。
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
、各(クエリ)を個別に最適化してみませんか?テーブルにインデックスを追加することはできませんか?
TABLE
およびFIELD
列を削除することもでき#temp
ます(結局、すべての行はTABLE = 'OTB' AND FIELD = 'STATUS'
特定の一時テーブルに対して持っています。)
CREATE TABLE
ステートメント)。反対票は、質問が明確ではなかったためです。