1

IoT データに使用される比較的大きな DB があり、約 6,000 万件のレコードがあります。挿入は、Stream Analytics からの BULK 挿入で非常に頻繁に実行されます。

これは私のテーブルスキーマです:

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 はキー列として含まれています。これがクエリの最終結果であるためです。興味があります。

ただし、非クラスター化インデックスを対象としたクエリを実行すると、1 つの結果を返すのに 3 ~ 5 分かかることがありますが、これは理解できません。私の実行計画によると、非クラスター化インデックスは意図したとおりにインデックス シークで使用されます。

実行計画へのリンクは次のとおりです: https://www.brentozar.com/pastetheplan/?id=r1NAwrRUN (クエリが完了するのに 03:32 かかりました)。

インデックスを再構築して断片化率を下げ、統計を更新しようとしましたが、今のところうまくいきません。

誰かが私の問題への方向性を教えてくれますか?

前もって感謝します。

4

2 に答える 2

0

このクエリの場合:

SELECT TOP (1) [ParameterValue]
FROM [dbo].[NVEControllerReadings]
WHERE DeviceUniqueIdentifier = '04EFB80706A7' AND
      ParameterTypeId = 19 AND
      ParameterNumberId = 24 AND
      InstanceId = 1
ORDER BY NVEControllerTimestamp desc;

最適なインデックスは(DeviceUniqueIdentifier, ParameterTypeId, ParameterNumberId, InstanceId, NVEControllerTimestamp desc)です。私はこれを最初に試します。

于 2019-03-07T12:15:53.613 に答える