2016-11-09 66 views
0

海兰家伙,簇索引的小桌子

我继承了下表和数据库只有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上创建聚簇索引?

回答

1

不,你不应该。你可以只添加一个指数,这将涵盖指数:

CREATE INDEX [IDX_Covering] ON dbo.MyTable(Name, EffectiveStartDate, EffectiveEndDate) 
INCLUDE(Value) 

如果@VariableName@EffectiveDate是变量与正确的类型,您现在应该看到索引查找。

我不确定这会有帮助,但您需要尝试,因为200行的索引扫描不算什么,但调用500次可能是一个问题。顺便说一下,如果这200行是在一个页面,我怀疑这不会帮助。问题可能在其他地方,如打开连接500次或类似的东西...

+0

谢谢。这确实是我想象的。由于所有操作都是在数据库内完成的,因此我没有连接问题 –