Jod*_*tte 5 c# sql sql-server asp.net
在我们的组织中,我们需要让员工通过提供WHERE子句来过滤我们的Web应用程序中的数据.它长期以来运行良好,但我们偶尔遇到用户提供需要对大型表或低效连接等进行全表扫描的查询.
一些小丑可能会写一些类似的东西:
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)
Run Code Online (Sandbox Code Playgroud)
显然,这不是一个很好的方法来查询这些表与计算值,非索引列,大量的OR和table_a和table_b上的无限制连接.
但对于用户来说,这可能是完全有道理的.
那么,允许内部用户向数据库提供查询同时确保它不会锁定十几个表并挂起网络服务器5分钟的最佳方式是什么?
我猜这是c#/ sql-server中的一种编程方式,用于在查询运行之前获取查询的执行计划.如果是这样,哪些因素会导致成本?估计的I/O成本?估算的CPU成本?什么是合理的限制,告诉用户他的查询不好?
编辑:我们是一家市场研究公司.我们有数以千计的调查,每个调查都有自己的数据.我们有数十名研究人员希望以任意方式对数据进行切片.我们有工具让他们使用GUI构建"有效"过滤器,但是一些"高级用户"想要提供他们自己的查询.我意识到这不是标准或最佳实践,但我怎样才能让许多用户使用任意复杂的条件和不断变化的条件来查询表所需的行?
你的问题的前提是:
在我们的组织中,我们需要通过提供WHERE子句让员工在我们的Web应用程序中过滤日期.
我发现这个前提是有缺陷的.我无法想象我会允许用户这样做的情况.除了您已经确定的问题之外,您还要接受SQL注入攻击.
我强烈建议您重新评估您的要求,看看您是否无法构建更安全,更专注的方式来允许您的用户进行搜索.
但是,如果您的用户确实非常复杂(并且信任!)足以直接提供WHERE子句,那么他们需要了解他们可以做什么,不能作为过滤器提交.
您可以尝试使用以下方法:
SET SHOWPLAN_ALL ON
GO
SET FMTONLY ON
GO
<<< Your SQL code here >>>
GO
SET FMTONLY OFF
GO
SET SHOWPLAN_ALL OFF
GO
Run Code Online (Sandbox Code Playgroud)
然后你就可以解析你所拥有的内容了。至于各种事情的界限在哪里,这需要一些经验。有一些事情需要注意,但没有什么是一成不变的。检查查询计划通常更像是一门艺术,而不是一门科学。
正如其他人指出的那样,我认为你的问题比技术影响更深入。事实上,你让不合格的人以这种方式访问你的数据库,这就是根本问题。根据过去的经验,我经常在那些太懒或太缺乏经验而无法正确捕获应用程序需求的公司中看到这种情况。我并不是说你们的公司环境一定是这样,但这就是我所看到的。