Я работаю над финансовым проектом и пытаюсь создать таблицу с лучшей стратегией индексации, в которой хранятся почасовые данные, и мне нужно более быстрое извлечение данных. Поскольку это конфиденциально, я объясню на примере таблицы погоды. Если у меня есть таблица ниже
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, 5) NOT NULL,
[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
Какие индексы были бы лучшими из возможных? У меня есть фильтр предложения where для CityId, TempDate и IsActive.
Мой обычный оператор выбора
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,
[TempDate] ASC,
[TempC] ASC,
[TempF] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_WeatherM] ON [dbo].[WeatherM]
(
[CityId] ASC,
[TempDate] ASC,
[IsActive] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Вариант 3: Любой другой?
TempF
иTempC
являются избыточными, укажите один и сделайте другой вычисляемым столбцом.TOP (1000)
безORDER BY
является недетерминированным и каждый раз может возвращать разные результаты - person Charlieface   schedule 25.03.2021