今日はコメントを読んで実験をしました。いくつかの座標を保存するシステムを想像しました。
状況は次のとおりです。
私は2つのテーブルを持っています、最初は:
CREATE TABLE Points
(
ID int IDENTITY(1,1) PRIMARY KEY,
X int,
Y int,
Name varchar(20),
Created datetime
)
座標(100万行)を保存しているだけです。2つ目は、選択によく使用されるポイント(約1100行)を格納するヘルパーテーブルです。
CREATE TABLE PointSearchHelper
(
X int,
Y int
)
これまでのところ元気です。
簡単に選択したいのですが:
SELECT p.* FROM Points p
INNER JOIN PointSearchHelper h
ON p.X = h.X AND p.Y = h.Y
スクリプトを実行すると、平均で約280ミリ秒で1100行が取得されます。
実行プランを確認すると、SQL Server 2008 R2がインデックスを推奨していることがわかります(誰が考えたでしょうか?;)):
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Points] ([X], [Y])
INCLUDE ([ID], [Name], [Created])
これはテーブルの完全なインデックスであり、各列が含まれています。比較するとサイズが「巨大」で、データを2回保存しています。
したがって、クエリnoははるかに高速です。約75ミリ秒(!)非常に大きな改善ですが、この改善にはほぼ2倍のスペースが必要です。
私の質問は単純です。列のSQLServerに、値を格納する方法や、二重ストレージから身を守るためのその他のトリックを指示する方法はありますか?
アップデート:
言い換えれば、同じパフォーマンスで「フルインデックス」を回避するためのトリックはありますか?