簇索引的小桌子
问题描述:
海兰家伙,簇索引的小桌子
我继承了下表和数据库只有200行:
CREATE TABLE [MyTable](
[Id] [uniqueidentifier] NOT NULL,
[Name] [varchar](255) NULL,
[Value] [varchar](8000) NULL,
[EffectiveStartDate] [datetime] NULL,
[EffectiveEndDate] [datetime] NULL,
[Description] [varchar](2000) NOT NULL DEFAULT (''),
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
正如你可以看到有一个群集的PK上唯一标识符列。我在做一些性能检查,到目前为止(CPU和IO)最昂贵的查询如下:
SELECT @Result = Value
FROM MyTable
WHERE @EffectiveDate BETWEEN EffectiveStartDate AND EffectiveEndDate
AND [email protected]
上述查询被封装在一个UDF,通常的UDF不叫在选择列表中或在子句,而是它的返回通常被分配给一个变量。
执行计划显示了一个聚集索引扫描
我们的系统是基于在大量实时聚合和数学处理的。每次我们的Web应用程序刷新主页面时,都会调用一堆存储过程和UDF,上面的查询每个用户每次刷新运行约500次。
我的问题是:我应该将PK更改为非聚簇,并在这样一个小表中的Name,EffectiveStartDate,EffectiveEndDate上创建聚簇索引?
答
不,你不应该。你可以只添加一个指数,这将涵盖指数:
CREATE INDEX [IDX_Covering] ON dbo.MyTable(Name, EffectiveStartDate, EffectiveEndDate)
INCLUDE(Value)
如果@VariableName
和@EffectiveDate
是变量与正确的类型,您现在应该看到索引查找。
我不确定这会有帮助,但您需要尝试,因为200行的索引扫描不算什么,但调用500次可能是一个问题。顺便说一下,如果这200行是在一个页面,我怀疑这不会帮助。问题可能在其他地方,如打开连接500次或类似的东西...
谢谢。这确实是我想象的。由于所有操作都是在数据库内完成的,因此我没有连接问题 –