У меня есть таблица dbo.participation
:Проблема с DateCreated
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
User VARCHAR(MAX) NOT NULL,
ParticipationLevel TINYINT NOT NULL,
Selector VARCHAR(MAX) NOT NULL,
DateCreated DATETIME NOT NULL
Я создал код, приведенный ниже, но, к сожалению, показывает плохую производительность @DateStart
и @DateStop
SELECT
dateadd(month, datediff(month, 0, DateCreated), 0) AS MDate
,COUNT(CASE WHEN ParticipationLevel >= 10 THEN Selector ELSE NULL END) AS ParticipationLevel1
,COUNT(CASE WHEN ParticipationLevel >= 30 THEN Selector ELSE NULL END) AS ParticipationLevel2
FROM
Participation
WHERE
(@DateStart IS NULL OR (@DateStart IS NOT NULL
AND DateCreated >= @DateStart))
AND (@DateEnd IS NULL OR (@DateEnd IS NOT NULL
AND DateCreate < @DateEnd))
GROUP BY
Dateadd(month, datediff(month, 0, DateCreate), 0)
ли вы, случается, есть какие-либо идеи, как улучшить мой код или, альтернативно, как изменить таблицу для повышения производительности?
Вы могли бы упростить вещи немного, установив DateStart в мин дату, если null и DateEnd до max-date, прежде чем использовать их в запросе ... исключая два предложения OR, которые всегда плохо относятся к производительности. Также убедитесь, что столбец DateCreated имеет соответствующий индекс, а PartitionLevel - в качестве столбца include. Я не вижу определения для «Отслеживания», хотя ... – pmbAustin
У вас есть какие-либо индексы на вашей таблице ?. Вы можете использовать индекс с ключом в 'DateCreated', и вы можете включить' ParticipationLevel'. Вам действительно нужно считать 'Tracking' ?, если этот столбец не может иметь' NULL', вы могли бы просто использовать 'COUNT (1)' вместо – Lamak
Оба хороших комментария выше. Еще одна информация? Сколько строк в таблице? Сколько месяцев он содержит? –