我们有一个Web应用程序,用户可以根据输入的参数执行即席查询.我还可以提到响应时间对用户来说非常重要.
Web页面根据输入的参数动态构造要执行的SQL.例如,如果用户为"业务单位"输入"1",我们构造一个这样的SQL:
SELECT * FROM FACT WHERE
BUSINESS_UNIT = '1'
--AND other criteria based on the input params
Run Code Online (Sandbox Code Playgroud)
我发现在用户未指定BUSINESS_UNIT的情况下,构造了以下查询
SELECT * FROM FACT WHERE
BUSINESS_UNIT LIKE '%'
--AND other criteria based on the input params
Run Code Online (Sandbox Code Playgroud)
恕我直言,这是不必要的(如果不是非常低效),并且保证发送代码不好修改,但由于我发送代码的速度比其他代码高得多,我相信我可能会因为"太挑剔而赢得声誉" ".
如果这是一个不恰当的问题,因为它不是直接编码Q,请告诉我,我会立即将其删除.我很困惑这样的主观问题是否被允许!我会看你的回复.
TY
更新:
我正在使用Oracle数据库.
我的印象是Oracle没有通过删除条件来优化"LIKE'%'"并且将其保留在效率较低的情况下.有人可以证实吗?
小智 14
这两个查询完全不同(从结果集的角度来看)
SELECT * FROM FACT;
Run Code Online (Sandbox Code Playgroud)
和
SELECT * FROM FACT WHERE
BUSINESS_UNIT LIKE '%';
Run Code Online (Sandbox Code Playgroud)
第一个将返回所有行,第二个,如果有NULL值,那么将不返回这些行,因为任何与NULLis 进行比较NULL并因此不满足谓词.这就是它在Oracle中的工作方式.
虽然这看起来非常低效,但我只是在SQL Server中进行了测试,而查询优化器足够聪明,可以将其过滤掉.
换一种说法,
SELECT * FROM FACT WHERE
BUSINESS_UNIT LIKE '%'
Run Code Online (Sandbox Code Playgroud)
和
SELECT * FROM FACT
Run Code Online (Sandbox Code Playgroud)
生成完全相同的查询计划.所以不应该有性能差异(我猜你的数据库引擎取决于它),虽然它确实看起来很邋..
这可能会影响您将其发回的决定.我个人可能会,但如果你已经在云下,那么你可以放松一下,至少在性能方面.