我有一個非常簡單的一個表查詢,需要幾秒鐘才能完成。我很困惑。當我從選擇頂端變爲50而不是200時,它變得更快。該表有大約一百萬行。Sql服務器性能不是我所期望的
我在所有提到的列上都有索引。
SELECT TOP 50 dbo.EmailDetails.Id,
FROM dbo.EmailDetails WITH (NOLOCK)
WHERE (dbo.EmailDetails.EmailSendStatus = 'NEEDTOSEND' OR
dbo.EmailDetails.EmailSendStatus = 'NEEDTOTEXT') AND
dbo.EmailDetails.EmailDetailsTopicId IS NOT NULL
ORDER BY dbo.EmailDetails.EmailSendPriority,
dbo.EmailDetails.Id DESC
該計劃生成是:
和全DDL是:
CREATE TABLE dbo.EmailDetails (
Id int IDENTITY(1, 1) NOT NULL,
AttendeesId int NOT NULL,
SponsorListContactId int NULL,
MessageUniqueId nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
EmailSendStatus nvarchar(16) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
EmailSendStartTime datetime NULL,
EmailSendFinishTime datetime NULL,
EmailSendLogMessage nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
Subject nvarchar(2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
BodyText nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
SentDateTime datetime NULL,
EmailFrom nvarchar(128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
EmailTo nvarchar(128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
EmailDetailsTopicId int NULL,
EmailDetailsGuid uniqueidentifier NULL,
EmailReadCount int NULL,
EmailReadDate datetime NULL,
EmailSendStatusChange datetime NULL,
EmailSendPriority int NULL,
TextTo varchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
CONSTRAINT EmailDetails_pk PRIMARY KEY CLUSTERED (Id)
WITH (
PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX EmailDetails_AttendeesIds_idx ON dbo.EmailDetails
(AttendeesId)
WITH (
PAD_INDEX = OFF,
DROP_EXISTING = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX EmailDetails_idx ON dbo.EmailDetails
(EmailDetailsGuid)
WITH (
PAD_INDEX = OFF,
DROP_EXISTING = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX EmailDetails_idx2 ON dbo.EmailDetails
(EmailDetailsTopicId)
WITH (
PAD_INDEX = OFF,
DROP_EXISTING = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX EmailDetails_idx3 ON dbo.EmailDetails
(SentDateTime)
WITH (
PAD_INDEX = OFF,
DROP_EXISTING = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX EmailDetails_priority_status_idx4 ON dbo.EmailDetails
(EmailSendPriority, EmailSendStatus)
WITH (
PAD_INDEX = OFF,
DROP_EXISTING = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX EmailDetails_SentStatus_idx ON dbo.EmailDetails
(EmailSendStatus)
WITH (
PAD_INDEX = OFF,
DROP_EXISTING = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX EmailDetails_topicid_attendeeid ON dbo.EmailDetails
(EmailDetailsTopicId, AttendeesId)
WITH (
PAD_INDEX = OFF,
DROP_EXISTING = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX EmailDetails_topicid_sponsorcontactid_idx ON dbo.EmailDetails
(EmailDetailsTopicId, SponsorListContactId)
WITH (
PAD_INDEX = OFF,
DROP_EXISTING = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
你有關於它的具體問題嗎? – B540Glenn
你知道查詢計劃是什麼嗎?導出IT(.sqlplan),然後我們可以提供幫助。 – TomTom
更快在200只是可能在內存中的行/索引。 50與200仍然需要排序。 – Paparazzi