Dans notre organisation, nous avons besoin de laisser les employés filtrer les données dans notre application web en fournissant des clauses WHERE. Ce système fonctionne parfaitement depuis longtemps, mais il arrive que des utilisateurs fournissent des requêtes qui nécessitent des analyses complètes de grandes tables ou des jointures inefficaces, etc.
Un clown pourrait écrire quelque chose comme :
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)
Évidemment, ce n'est pas une bonne façon d'interroger ces tables avec des valeurs calculées, des colonnes non indexées, beaucoup de OU et une jointure sans restriction sur table_a et table_b.
Mais pour un utilisateur, cela peut être tout à fait logique.
Quel est donc le meilleur moyen, le cas échéant, de permettre aux utilisateurs internes de fournir une requête à la base de données tout en garantissant qu'elle ne verrouillera pas une douzaine de tables et ne bloquera pas le serveur web pendant 5 minutes ?
Je suppose qu'il s'agit d'un moyen programmatique en c#/sql-server pour obtenir le plan d'exécution d'une requête avant son exécution. Et si c'est le cas, quels facteurs contribuent au coût ? Coût estimé des E/S ? Coût estimé du CPU ? Quelles seraient les limites raisonnables pour dire à l'utilisateur que sa requête n'est pas bonne ?
EDIT : Nous sommes une société d'études de marché. Nous avons des milliers d'enquêtes, chacune avec ses propres données. Nous avons des dizaines de chercheurs qui veulent découper ces données de manière arbitraire. Nous disposons d'outils qui leur permettent de construire des filtres "valides" à l'aide d'une interface graphique, mais certains "utilisateurs expérimentés" veulent fournir leurs propres requêtes. Je me rends compte que ce n'est pas la norme ou la meilleure pratique, mais comment faire autrement pour permettre à des dizaines d'utilisateurs d'interroger des tables pour obtenir les lignes qu'ils veulent en utilisant des conditions arbitrairement complexes et des conditions qui changent constamment ?