SQL Server 2016 Enterprise Edition の 40m レコードの非メモリ最適化テーブルのすべての列に非クラスター化列ストア インデックスがあります。
列ストア インデックスの使用を強制するクエリは大幅に高速に実行されますが、オプティマイザーは引き続きクラスター化インデックスとその他の非クラスター化インデックスの使用を選択します。利用可能な RAM がたくさんあり、次元モデルに対して適切なクエリを使用しています。
オプティマイザーが columnstoreindex を選択しないのはなぜですか? そして、どうすればその使用を奨励できますか (ヒントを使用せずに)?
列ストアを使用しないサンプル クエリを次に示します。
SELECT
COUNT(*),
SUM(TradeTurnover),
SUM(TradeVolume)
FROM DWH.FactEquityTrade e
--with (INDEX(FactEquityTradeNonClusteredColumnStoreIndex))
JOIN DWH.DimDate d
ON e.TradeDateId = d.DateId
JOIN DWH.DimInstrument i
ON i.instrumentid = e.instrumentid
WHERE d.DateId >= 20160201
AND i.instrumentid = 2
ヒントなしで 7 秒、ヒントありで数分の 1 秒かかります。ヒントなしのクエリ プランはこちらです。ヒント付きのクエリ プランはこちらです。
列ストア インデックスの作成ステートメントは次のとおりです。
CREATE NONCLUSTERED COLUMNSTORE INDEX [FactEquityTradeNonClusteredColumnStoreIndex] ON [DWH].[FactEquityTrade]
(
[EquityTradeID],
[InstrumentID],
[TradingSysTransNo],
[TradeDateID],
[TradeTimeID],
[TradeTimestamp],
[UTCTradeTimeStamp],
[PublishDateID],
[PublishTimeID],
[PublishedDateTime],
[UTCPublishedDateTime],
[DelayedTradeYN],
[EquityTradeJunkID],
[BrokerID],
[TraderID],
[CurrencyID],
[TradePrice],
[BidPrice],
[OfferPrice],
[TradeVolume],
[TradeTurnover],
[TradeModificationTypeID],
[InColumnStore],
[TradeFileID],
[BatchID],
[CancelBatchID]
)
WHERE ([InColumnStore]=(1))
WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0) ON [PRIMARY]
GO
アップデート。Count(*) の代わりに Count(EquityTradeID) を使用 し、ヒントを含めて計画する