В нашей организации у нас есть необходимость позволить сотрудникам фильтровать данные в нашем веб-приложении, предоставляя предложения WHERE. Он работал большой в течение длительного времени, но иногда мы столкнулись с пользователями, обеспечивающих запросы, которые требуют полного сканирования таблиц на больших таблиц или неэффективное объединений и т.д.Обеспечить только «разумные» запросы
Некоторые клоун мог бы написать что-то вроде:
select * from big_table where
Name in (select name from some_table where name like '%search everything%')
or name in ('a', 'b', 'c')
or price < 20
or price > 40
or exists (select 1 from some_other_table where col1 + col2 + col3 = 4)
or exists (select 1 from table_a, table+b)
Очевидно, это не отличный способ запросить эти таблицы с вычисленными значениями, неиндексированными столбцами, множеством OR и неограниченным соединением на table_a и table_b.
Но для пользователя это может иметь общий смысл.
Так что лучший способ, если таковой имеется, позволить внутренним пользователям предоставлять запрос в базу данных, гарантируя, что он не будет блокировать десятки таблиц и повесить веб-сервер в течение 5 минут?
Я предполагаю, что это программный способ в C#/sql-server, чтобы получить план выполнения запроса до его запуска. И если да, то какие факторы способствуют стоимости? Расчетная стоимость ввода-вывода? Расчетная стоимость процессора? Каковы были бы разумные пределы, чтобы сообщить пользователю, что его запрос не подходит?
EDIT: Мы являемся компанией, занимающейся исследованиями рынка. У нас есть тысячи опросов, каждый из которых имеет свои собственные данные. У нас есть десятки исследователей, которые хотят разрезать эти данные произвольным образом. У нас есть инструменты, позволяющие им создавать «допустимые» фильтры с помощью графического интерфейса, но некоторые «опытные пользователи» хотят предоставить свои собственные запросы. Я понимаю, что это не стандартная или лучшая практика, но как еще я могу позволить десяткам пользователей запрашивать таблицы для строк, которые они хотят, используя произвольно сложные условия и постоянно меняющиеся условия?
В дополнение к ответам, предлагающим некоторый слой между клиентом и написанием предложений WHERE, как насчет создания представлений для общих запросов? – Zwergner
Я бы скопировал данные в хранилище данных и попросил пользователей проанализировать данные там, где это безопасно. – CaffGeek