이 특정 쿼리와 관련하여 :왜 불평등은 결과를 동등보다 빨리 반환합니까?
쿼리 된 데이터를 이해할 필요가 없습니다. 이는 부적절합니다.
SELECT
de.DocumentEntryId,
de.Number,
currentdev.ToIgnore,
previousdev.ToIgnore,
currentdev.DocumentEntryValueId AS CurrentDocumentEntryValueId,
SUM(currentper.Value) AS CurrentPaymentRate,
SUM(currentdevr.ConversionRate) AS CurrentConversionRate,
MAX(previousdev.DocumentEntryValueId) AS PreviousDocumentEntryValueId,
SUM(previousper.Value) AS PreviousPaymentRate,
SUM(previousdevr.ConversionRate) AS PreviousConversionRate
FROM
DocumentEntry de
INNER JOIN PaymentEntry currentpe ON currentpe.PaymentEntryId = de.CurrentPaymentEntryId
INNER JOIN DocumentEntryValue currentdev ON currentpe.DocumentEntryValueId = currentdev.DocumentEntryValueId
INNER JOIN DocumentEntryValue previousdev ON previousdev.DocumentEntryId = de.DocumentEntryId
INNER JOIN PaymentEntryRate currentper ON currentpe.PaymentEntryId = currentper.PaymentEntryId
INNER JOIN DocumentEntryValueRate currentdevr ON currentdev.DocumentEntryValueId = currentdevr.DocumentEntryValueId
INNER JOIN PaymentEntry previouspe ON previousdev.DocumentEntryValueId = previouspe.DocumentEntryValueId
INNER JOIN PaymentEntryRate previousper ON previouspe.PaymentEntryId = previousper.PaymentEntryId
INNER JOIN DocumentEntryValueRate previousdevr ON previousdevr.DocumentEntryValueId = previousdev.DocumentEntryValueId
WHERE
previousdev.DocumentEntryValueId <> currentdev.DocumentEntryValueId
AND currentdev.ToIgnore <> 1
AND previousdev.ToIgnore <> 1
AND currentpe.PaymentId = previouspe.PaymentId
GROUP BY
de.DocumentEntryId,
de.Number,
currentdev.ToIgnore,
previousdev.ToIgnore,
currentdev.DocumentEntryValueId
ORDER BY DocumentEntryId
특히이 두 불평등 :
AND currentdev.ToIgnore <> 1
AND previousdev.ToIgnore <> 1
주 : ToIgnore는 비트 열이다
그냥 절가 를보십시오.
이 쿼리는 약 1300 개의 행을 반환하는 데 약 10 초가 걸립니다. 나는 평등 연산자를 사용하려면 다음 두 줄을 변경하는 경우
그러나 :
는AND currentdev.ToIgnore = 0
AND previousdev.ToIgnore = 0
그것은 아무것도 반환 영원히합니다.
표 DocumentEntry 인덱스 :
ALTER TABLE [dbo].[DocumentEntry] ADD CONSTRAINT [DocumentEntry$0] PRIMARY KEY CLUSTERED
(
[DocumentEntryId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [IDX_DOCUMENTENTRY_REFNUMBER] ON [dbo].[DocumentEntry]
(
[EntryReferenceNumber] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [missing_index_14227] ON [dbo].[DocumentEntry]
(
[MasterDocumentEntryId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [missing_index_186297_186296_DocumentEntry] ON [dbo].[DocumentEntry]
(
[Number] ASC
)
INCLUDE ( [DocumentEntryId]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
표 DocumentEntryValue 인덱스 :
ALTER TABLE [dbo].[DocumentEntryValue] ADD CONSTRAINT [DocumentEntryValue$0] PRIMARY KEY CLUSTERED
(
[DocumentEntryValueId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [IDX_DOCUMENTENTRYVALUE_DOCENTRYID] ON [dbo].[DocumentEntryValue]
(
[DocumentEntryId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [IDX_DOCUMENTENTRYVALUE_REFNUMBER] ON [dbo].[DocumentEntryValue]
(
[EntryValueReferenceNumber] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [missing_index_4022_4021_DocumentEntryValue] ON [dbo].[DocumentEntryValue]
(
[ReferenceDocumentId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
표 DocumentEntryValueRate 그것은이 도움이
, 여기에 각 테이블에서 인덱스입니다 ...에서 dexes :
ALTER TABLE [dbo].[DocumentEntryValueRate] ADD CONSTRAINT [DocumentEntryValueRate$0] PRIMARY KEY CLUSTERED
(
[DocumentEntryValueRateId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [missing_index_56865_56864_DocumentEntryValueRate] ON [dbo].[DocumentEntryValueRate]
(
[DocumentEntryValueId] ASC
)
INCLUDE ( [timestamp],
[DocumentEntryValueRateId],
[RateId],
[RateVersionId],
[RateTypeId],
[RateGroupId],
[RatePeriodValueId],
[ConversionRate]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
표 PaymentEntry 인덱스 :
ALTER TABLE [dbo].[PaymentEntry] ADD CONSTRAINT [PaymentEntry$0] PRIMARY KEY CLUSTERED
(
[PaymentEntryId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [IDX_PAYMENTENTRY_DOCENTRYVALUEID] ON [dbo].[PaymentEntry]
(
[DocumentEntryValueId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [missing_index_2517_2516_PaymentEntry] ON [dbo].[PaymentEntry]
(
[PaymentId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
표 PaymentEntryRate 인덱스 : 나는 평등 연산자를 사용할 때 여기
ALTER TABLE [dbo].[PaymentEntryRate] ADD CONSTRAINT [PaymentEntryRate$0] PRIMARY KEY CLUSTERED
(
[PaymentEntryRateId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [IDX_PAYMENTENTRYRATE_PAYMENTENTRYID] ON [dbo].[PaymentEntryRate]
(
[PaymentEntryId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [missing_index_2618_2617_PaymentEntryRate] ON [dbo].[PaymentEntryRate]
(
[RateId] ASC
)
INCLUDE ( [timestamp],
[PaymentEntryRateId],
[PaymentEntryId],
[RateTypeId],
[RateGroupId],
[RateVersionId],
[RatePeriodValueId],
[Value]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
CREATE NONCLUSTERED INDEX [missing_index_2686_2685_PaymentEntryRate] ON [dbo].[PaymentEntryRate]
(
[RateTypeId] ASC,
[RateId] ASC,
[RatePeriodValueId] ASC
)
INCLUDE ( [PaymentEntryId]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
이 예상 실행 계획의 일부입니다 (= 0) : 누군가이 경우 (또는 대부분의 경우) 부등호 연산자가 평등 연산자보다 빠르게 보이는 이유를 설명 할 수 있습니까?
단서의 두 쿼리에 대한 실제 실행 계획을 비교 했습니까? –
불평등 쿼리에서 실행 계획을 얻을 수 있지만 평등 쿼리는 그냥 영원히 실행됩니다 ... –
비트 필드는 두 개가 아니라 세 가지 상태를 기억하십시오. –