У меня есть относительно большая БД, используемая для данных IoT, примерно около 60 миллионов записей. Вставки выполняются очень часто в BULK Inserts из Stream Analytics.
Это моя схема таблицы:
CREATE TABLE [dbo].[NVEControllerReadings](
[DeviceUniqueIdentifier] [nvarchar](100) NOT NULL,
[NVEControllerTimestamp] [datetimeoffset](7) NOT NULL,
[ProcessedInAzureUtc] [datetimeoffset](7) NOT NULL,
[ParameterTypeId] [int] NULL,
[InstanceId] [int] NULL,
[ParameterNumberId] [int] NOT NULL,
[ParameterValue] [float] NULL,
[ParameterText] [nvarchar](255) NULL)
При выполнении запросов мы всегда ищем последние записи для устройства, поэтому у меня есть следующий кластеризованный индекс:
CREATE CLUSTERED INDEX [IX_NVEControllerReadings] ON [dbo].[NVEControllerReadings](
[DeviceUniqueIdentifier] ASC,
[NVEControllerTimestamp] DESC)WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
У меня также есть некластеризованный индекс для охвата индексов, нацеленных на ParameterTypeId, ParameterNumberId и InstanceId.
CREATE NONCLUSTERED INDEX [IX_ParameterTypeId_ParameterNumberId_InstanceId] ON [dbo].[NVEControllerReadings](
[ParameterTypeId] ASC,
[ParameterNumberId] ASC,
[InstanceId] ASC) INCLUDE ( [ParameterValue]) WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
ParameterValue включен в качестве ключевого столбца, потому что это окончательный результат запроса, меня это интересует.
Однако при выполнении запросов, нацеленных на мой некластеризованный индекс, может потребоваться 3-5 минут, чтобы вернуть один результат, чего я не понимаю. Согласно моему плану выполнения, некластеризованный индекс используется по назначению с поиском по индексу.
Вот ссылка на план выполнения: https://www.brentozar.com/pastetheplan/?id=r1NAwrRUN (выполнение запроса заняло 03:32).
Я пытался перестроить свои индексы, чтобы добиться более низкой скорости фрагментации и обновить статистику, но пока безуспешно.
Может ли кто-нибудь указать мне направление моей проблемы?
Заранее спасибо.