问题描述
我正在从事一个金融项目,我正在尝试设计一个具有最佳索引策略的表,该表存储每小时数据,我需要更快的数据检索。由于它是机密的,我将用天气表的例子来解释。如果我有下表
CREATE TABLE [dbo].[WeatherM](
[WID] [int] IDENTITY(1,1) NOT NULL,[CityId] [int] NOT NULL,[TempDate] [datetime] NOT NULL,[TempF] [decimal](18,5) NOT NULL,[TempC] [decimal](18,[IsActive] [bit] NOT NULL,[IsDeleted] [bit] NOT NULL
) ON [PRIMARY]
ALTER TABLE [dbo].[WeatherM] ADD CONSTRAINT [DF_WeatherM_IsActive] DEFAULT ((1)) FOR [IsActive]
GO
ALTER TABLE [dbo].[WeatherM] ADD CONSTRAINT [DF_WeatherM_IsDelete] DEFAULT ((0)) FOR [IsDeleted]
GO
什么是最好的索引?我有 CityId、TempDate 和 IsActive 的 where 子句过滤器。
我通常的选择语句是
SELECT TOP (1000) [WID],[CityId] -- Could join with City table and get CityName,[TempDate],[TempF] --fahrenheit,[TempC] --Celcius
FROM [dbo].[WeatherM] WITH (NOLOCK)
WHERE CityId = @CityId
AND TEMPDATE BETWEEN @Date1 and @Date2
AND IsActive = 1
更快获得结果的最佳索引是什么
选项 1:使用 where 子句列创建多列聚集索引
CREATE CLUSTERED INDEX [IX_WeatherM_1] ON [dbo].[WeatherM]
(
[CityId] ASC,[TempDate] ASC,[IsActive] ASC
)WITH (PAD_INDEX = OFF,STATISTICS_norECOmpuTE = OFF,SORT_IN_TEMPDB = OFF,IGnorE_DUP_KEY = OFF,DROP_EXISTING = OFF,ONLINE = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
-- 我是否需要进一步的非聚集索引
选项 2:创建带有结果集列的多列聚集索引和一个带有过滤列的非聚集索引
CREATE CLUSTERED INDEX [IX_WeatherM_1] ON [dbo].[WeatherM]
(
[CityId] ASC,[TempC] ASC,[TempF] ASC
)WITH (PAD_INDEX = OFF,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_WeatherM] ON [dbo].[WeatherM]
(
[CityId] ASC,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
选项 3:还有其他选择吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)