送信する準備ができており、既に送信されたすべての電子メール メッセージを保持するテーブルがあります。テーブルには 100 万行を超える行が含まれています。
以下は、まだ送信する必要があるメッセージを見つけるためのクエリです。エラーが 5 回発生すると、メッセージは試行されなくなり、手動で修正する必要があります。メッセージが送信されるまでSentDate
残ります。null
SELECT TOP (15)
ID,
FromEmailAddress,
FromEmailDisplayName,
ReplyToEmailAddress,
ToEmailAddresses,
CCEmailAddresses,
BCCEmailAddresses,
[Subject],
Body,
AttachmentUrl
FROM sysEmailMessage
WHERE ErrorCount < 5
AND SentDate IS NULL
ORDER BY CreatedDate
インデックスが不足しているため、クエリが遅いと思いました。データベース エンジン チューニング アドバイザーにクエリを提供しました。以下のインデックス(および私が一般的に無視するいくつかの統計)を示唆しています:
SET ANSI_PADDING ON
CREATE NONCLUSTERED INDEX [_dta_index_sysEmailMessage_7_1703677117__K14_K1_K12_5_6_7_8_9_10_11_15_17_18] ON [dbo].[sysEmailMessage]
(
[SentDate] ASC,
[ID] ASC,
[ErrorCount] ASC
)
INCLUDE ( [FromEmailAddress],
[ToEmailAddresses],
[CCEmailAddresses],
[BCCEmailAddresses],
[Subject],
[Body],
[AttachmentUrl],
[CreatedDate],
[FromEmailDisplayName],
[ReplyToEmailAddress]) WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
(ちなみに、このインデックスの推奨サイズは 5,850,573 KB (?) で、これはほぼ 6 GB であり、私にはまったく意味がありません。)
私の質問は、この提案されたインデックスは意味がありますか? たとえば、ID
列が含まれているのに、クエリには必要ないのはなぜですか (私が知る限り)。インデックスに関する私の知識によると、それらは関連する行を見つけるための高速ルックアップを目的としています。自分でインデックスを設計する必要がある場合は、次のようなものを考え出します。
SET ANSI_PADDING ON
CREATE NONCLUSTERED INDEX [index_alternative_a] ON [dbo].[sysEmailMessage]
(
[SentDate] ASC,
[ErrorCount] ASC
)
WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
オプティマイザーは本当に賢いのでしょうか、それとも私のインデックスはより効率的でおそらくより優れているでしょうか?