今天我只是看了一些评论,我做了一些实验。我想象了一个存储一些坐标的系统。
情况如下:
我有两张桌子,第一张是:
CREATE TABLE Points
(
ID int IDENTITY(1,1) PRIMARY KEY,
X int,
Y int,
Name varchar(20),
Created datetime
)
它只是存储坐标(100 万行)。第二个是一个帮助表,存储一些我们说经常使用的点进行选择(大约 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])
这是一个完整的表索引,包含每一列。它的大小是“巨大的”比较,我现在存储数据两次!
所以查询 no 要快得多!大约是75 毫秒(!) 非常大的改进但我需要几乎两倍的空间来进行这种改进。
我的问题很简单:有没有办法告诉列上的 SQL Server 如何存储值或任何其他技巧来避免双重存储?
更新:
换句话说:是否有任何技巧可以避免具有相同性能的“完整索引”?