Каков наиболее эффективный способ запроса некоторых данных для каждой даты в диапазоне дат

#c# #sql-server #task-parallel-library

#c# #sql-сервер #задача-параллельная-библиотека

Вопрос:

У меня есть требование, в котором есть встроенная табличная функция SQL, которая принимает дату в качестве параметра и возвращает результирующий набор. Теперь мне нужно получить этот набор результатов для каждой даты в диапазоне дат.

Однократное выполнение функции занимает около 2-3 минут, поэтому, если мы запускали эту функцию в течение месяца, для завершения выполнения потребуется около 1 часа.

Поэтому я ищу несколько инновационных способов оптимизации этого.

Я попытался создать запрос union all, который включает все даты, в надежде, что я смогу добиться параллельного выполнения.

 select 
    dateValue
    ,col1
    ,col2
    ,col3
from dbo.GetResultSet('2020-01-01')

union all

select 
    dateValue
    ,col1
    ,col2
    ,col3
from dbo.GetResultSet('2020-01-02')

union all

select 
    dateValue
    ,col1
    ,col2
    ,col3
from dbo.GetResultSet('2020-01-03')
... 
  

но это приводит к следующей ошибке:

Обработчику запросов не хватило внутренних ресурсов, и он не смог создать план запроса. Это редкое событие и ожидается только для чрезвычайно сложных запросов или запросов, которые ссылаются на очень большое количество таблиц или разделов. Пожалуйста, упростите запрос.

Также обратите внимание, что диапазон дат может длиться и 1 год.

Я также пытался написать C # для запуска этой функции с использованием разных дат Parallel.ForEach , но это дает мне исключение времени ожидания соединения.

Я использую SQL Server 2012.

Приветствуется любое предложение или помощь.

Комментарии:

1. Нет простого ответа на ускорение запросов, не видя запросов и не зная структуры таблицы и задействованных индексов. Вашим первым шагом должна быть проверка плана выполнения.

2. Наихудший подход — использование потоков в базе данных, создание лучшей функции sql должно быть вашим первым выбором

3. @DaleK Эта функция широко используется практически во всех модулях приложения, и давайте предположим, что мы не можем изменить эту функцию.

4. Это не дает никакой дополнительной информации, которая позволила бы нам помочь вам — покажите нам план выполнения. Вы можете добавлять индексы к таблицам, не изменяя функцию.

5. Привет @DaleK план выполнения функции составляет 297 МБ, не уверен, как поделиться этим. Есть предложения?