#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 МБ, не уверен, как поделиться этим. Есть предложения?