MadMyche
Индексы действительно не помогут вам с этой агрегатной функцией; однако есть альтернативы, если вы можете добавить столбцы, таблицы или процедуры. Предлагаемые увеличения будут определяться количеством устройств и процентом строк, которые они вносят.
Чтобы все стало лучше... у нас есть несколько вариантов...
Допустим, мы пошли по пути нормализации и создали TelemetryDevice таблица должна представлять собой уникальный список устройств и некоторую простую информацию о нем
CREATE TABLE TelemetryDevice (
DeviceID INT IDENTITY(1,1) NOT NULL,
DeviceName NVARCHAR(100) NOT NULL,
LastContact DATETIME NULL,
-- other "device property" fields
CONSTRAINT PK_TelemetryDevice_DeviceName PRIMARY KEY CLUSTERED ([DeviceID] ASC) ON [PRIMARY]
) ON [PRIMARY]
GO
Затем мы могли бы создать/изменить хранимую процедуру, которая заполняет таблицу журнала телеметрии и обновляет таблицу устройств
CREATE PROCEDURE Telemetry_Log_IncomingCommunication (
@DeviceName VARCHAR(50)
--, Whatever data values you have
) AS
BEGIN
DECLARE @Now DATETIME = GetDate()
INSERT Telemetry (DeviceName, SentAt /* data columns */)
VALUES (@DeviceName, @Now /* data values */)
UPDATE TelemetryDevice
SET LastContact = @Now
WHERE DeviceName = @DeviceName
END
GO
Чтобы сделать это действительно нормализованным, ваша существующая таблица будет изменена, чтобы быть фактическим DeviceID; и хранимая процедура будет скорректирована соответствующим образом.
Ваш новый запрос будет следующим
SELECT DeviceName, LastContact
FROM Telemetry
-- GROUP BY not needed
-- ORDER BY optional
Поскольку имя устройства является первичным ключом, вам не нужно будет добавлять индекс
Другой подход заключается в добавлении столбца в существующую таблицу
ALTER TABLE Telemetry
ADD LastMessage BIT NULL DEFAULT (0)
GO
И снова соответствующая хранимая процедура для его заполнения
ALTER PROCEDURE Telemetry_Log_IncomingCommunication (
@DeviceName VARCHAR(50)
--, Whatever values you are passing in
) AS
BEGIN
DECLARE @Now DATETIME = GetDate()
UPDATE Telemetry
SET LastMessage = 0
WHERE DeviceName = @DeviceName
INSERT Telemetry (DeviceName, SentAt, LastMessage /* data columns */)
VALUES (@DeviceName, @Now, 1 /* data values */)
END
GO
Тогда ваш новый запрос будет следующим
SELECT DeviceName, SentAt
FROM Telemetry
WHERE LastMessage = 1
-- GROUP BY not needed
-- ORDER BY optional
Что было бы полезно, если бы у вас были индексы на DeviceName сами по себе и уникальный индекс DeviceName и столбца LastMessage.