索引策略 - 表设计每小时数据

问题描述

我正在从事一个金融项目,我正在尝试设计一个具有最佳索引策略的表,该表存储每小时数据,我需要更快的数据检索。由于它是机密的,我将用天气表的例子来解释。如果我有下表

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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...