Я работаю над проектом ASP.NET MVC, который позволяет пользователям создавать произвольно сложные запросы, одновременно добавляя предложение items.
Затем приложение генерирует соответствующий SQL, запускает его (в настоящее время использует SQL Server 2008) и отображает результаты с разбивкой, включающей количество подходящих записей для каждого добавленного элемента.
, например
UserQuery:
Имеет условие A (45)
И условиеB (33)
Или УсловиеC (55)
И условиеD (15)
Всего: 48
Проблема в том, как лучше создать и запустить SQL, чтобы получить эти результаты с учетом производительности и масштабируемости.
Первоначальная реализация построила запрос (используя подзапросы) для каждого элемента (в сочетании с предыдущим), по очереди выполняя их отдельно как скаляры. Каждое выполнение включало генерацию SQL и открытие нового SqlConnection, создание нового SqlCommand и выполнение.
Я потратил некоторое время на переписывание этого, чтобы создать один запрос (который использует CTE), чтобы вернуть одну строку с результатом каждого элемента в виде столбца.
Для этого требовалось только одно выполнение, и производительность казалась незначительной, пока запросы не стали сложными и SQL Server не начал выдавать ошибки:
Обработчику запросов не хватило
внутренние ресурсы так и не смогли
составить план запроса
Каков наиболее масштабируемый и эффективный способ построения и выполнения такого запроса?