Вопрос:
Я пытаюсь запустить запрос, но он возвращает ошибку, которой недостаточно, чтобы ресурсы обрабатывали ее.
Запрос:
SELECT ID, ISNULL(LINK,’0′), FLOOR(ISNULL(AMOUNTPAID,’0′)), CONVERT(VARCHAR(8), DATEPAID, 5), PAYSOURCE FROM finance WHERE DATEADD(month,24,DATEPAID) > GETDATE() AND ID IN (A LIST OF IDs)
Первый выбор – около 1,4 миллиона результатов, а в списке ID – около 100 000 идентификаторов.
Есть ли другой способ построить этот запрос?
Ответ №1
Я предполагаю, что вы используете длинный список из 100 000 значений IN и видите эту ошибку
Обработчик запросов исчерпал внутренние ресурсы и не смог создать план запроса. Это редкое событие и ожидается только для чрезвычайно сложных запросов или запросов, которые ссылаются на очень большое количество таблиц или разделов. Пожалуйста, упростите запрос. Если вы считаете, что получили это сообщение по ошибке, обратитесь в Службу поддержки клиентов за дополнительной информацией.
По предложению в этом элементе Connect поместите список идентификаторов во временную таблицу или индексированный параметр таблицы.
Ответ №2select ID,ISNULL(LINK,’0′),FLOOR(ISNULL(AMOUNTPAID,’0′)),CONVERT(VARCHAR(8), DATEPAID, 5) ,PAYSOURCE from dbo.finance f inner join listofid l on f.id=l.id where DATEADD(month,24,DATEPAID) > GETDATE()
также вам нужно создать некластеризованный индекс для DATEPAID.hope id – pk. BTW, список id поступает из таблицы/переменной?
Я думаю, что запрос будет быстрым. Вы хотите сказать, что есть другой запрос, в который вы помещаете список id в переменную.