У меня очень медленный запрос. Я опубликую здесь псевдокод.
SELECT
ListofDates.Date as Event,
(SELECT COUNT(DISTINCT TableofExtensiveJoins1.ID)
FROM TableofExtensiveJoins1)
WHERE Event=TableofExtensiveJoins1.Date AND Condition1
(SELECT COUNT(DISTINCT TableofExtensiveJoins2.ID)
FROM TableofExtensiveJoins2
WHERE Event = TableofExtensiveJoins2.Date AND Condition2)
(SELECT COUNT(DISTINCT TableofExtensiveJoins3.ElementID)
FROM TableofExtensiveJoins3
WHERE Event = TableofExtensiveJoins3.Date AND Condition3)
FROM
ListOfDates
Здесь следует заметить, что TableOfExtensiveJoins1, 2 и 3 - это абсолютно одинаковые запросы. Но условие «Где» у каждого разное. Выполнение одного и того же запроса 3 раза просто для 3-разной фильтрации кажется немного сложным. Но, как вы можете видеть, это необходимо, потому что я хочу считать вещи на столе. Таблица каждый раз фильтруется по-разному. Но из-за «счета» у меня есть страх, что SQL компилирует таблицу каждый раз снова.
У меня есть этот страх, потому что запрос выполняется исключительно долго. Подзапросы сами по себе действительно сложны. Для примера: получение только одной записи основного запроса занимает около 15 секунд. Сам подзапрос занимает 5 секунд, что объясняет 15 секунд, 3 * 5 = 15. И чтобы выполнить весь основной запрос, он, вероятно, получит несколько тысяч записей. Я позволил ему бежать 50 минут один день, и он не закончился sh. Очевидно, это не линейно, но это не относится к делу. Я просто хотел подчеркнуть, насколько плох запрос.
Так что, очевидно, мне нужно повысить производительность этого запроса. Ради оптимизации допустим, я не могу создавать новые таблицы в базе данных. Остальное было бы легко, я думаю. Предположим также, что TableoExtensiveJoins уже оптимизирован.
Итак, мой вопрос здесь, как я могу переписать запрос, чтобы выполнить его быстрее. Скомпилируйте таблицу один раз, а затем запустите фильтр при компиляции. Запрос выполняется в Microsoft SQL Reporting Services. Таким образом, может быть ограничение на то, какой тип запроса может выполняться. Но я не уверен на 100% в этом.
Редактировать: желаемый результат может быть полезным для правильного ответа.
TableOfExtensiveJoins - это в основном таблица событий. Когда-нибудь что-то определенное c происходит (не имеет значения), создается новая запись.
Теперь я хочу, чтобы по любой дате подсчитывалось количество событий с определенными условиями. ListOfDates имеет список дат. Он принимает первый случай события, а затем создает список дат, который затем фильтруется с помощью Day (Date)% 5 = 1. Так что каждые 5. дата.