Zapewnij tylko „rozsądne” zapytania

W naszej organizacji musimy pozwolić pracownikom filtrować dane w naszej aplikacji internetowej, dostarczając klauzule WHERE. Przez długi czas działało świetnie, ale czasami spotykamy użytkowników dostarczających zapytania, które wymagają pełnego skanowania tabeli na dużych stołach lub nieefektywnych złączeniach itp.

Jakiś klaun może napisać coś takiego:

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)

Oczywiście nie jest to świetny sposób na odpytywanie tych tabel o wartości obliczone, kolumny nieindeksowane, wiele OR i nieograniczone połączenie na table_a i table_b.

Ale dla użytkownika może to mieć sens.

Jaki jest najlepszy sposób, jeśli w ogóle, aby użytkownicy wewnętrzni mogli dostarczyć zapytanie do bazy danych, jednocześnie upewniając się, że nie zablokuje kilkunastu tabel i zawiesi serwer WWW na 5 minut?

Zgaduję, że jest to programowy sposób w c # / sql-server, aby uzyskać plan wykonania zapytania przed jego uruchomieniem. A jeśli tak, jakie czynniki przyczyniają się do kosztów? Szacowany koszt we / wy? Szacowany koszt procesora? Jakie byłyby rozsądne ograniczenia, aby powiedzieć użytkownikowi, że jego zapytanie nie jest dobre?

EDYCJA: Jesteśmy firmą zajmującą się badaniami rynku. Mamy tysiące ankiet, każde z własnymi danymi. Mamy dziesiątki naukowców, którzy chcą podzielić te dane na dowolne sposoby. Mamy narzędzia pozwalające im konstruować „poprawne” filtry za pomocą GUI, ale niektórzy „zaawansowani użytkownicy” chcą dostarczać własne zapytania. Zdaję sobie sprawę, że nie jest to standardowa lub najlepsza praktyka, ale jak inaczej mogę pozwolić dziesiątkom użytkowników na tworzenie tabel zapytań dla wierszy, których chcą, korzystając z dowolnie złożonych warunków i ciągle zmieniających się warunków?

questionAnswers(11)

yourAnswerToTheQuestion