你会把这个简单的SQL发回给返工吗?

Cha*_*adD 8 sql oracle

我们有一个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中的工作方式.


wom*_*omp 9

虽然这看起来非常低效,但我只是在SQL Server中进行了测试,而查询优化器足够聪明,可以将其过滤掉.

换一种说法,

SELECT * FROM FACT WHERE 
BUSINESS_UNIT LIKE '%'
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM FACT
Run Code Online (Sandbox Code Playgroud)

生成完全相同的查询计划.所以不应该有性能差异(我猜你的数据库引擎取决于它),虽然它确实看起来很邋..

这可能会影响您将其发回的决定.我个人可能会,但如果你已经在云下,那么你可以放松一下,至少在性能方面.