Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你会把这个简单的SQL发回重做吗?_Sql_Oracle - Fatal编程技术网

你会把这个简单的SQL发回重做吗?

你会把这个简单的SQL发回重做吗?,sql,oracle,Sql,Oracle,我们有一个web应用程序,其中用户根据输入的参数执行特殊查询。我还可以提到,响应时间对用户来说非常重要 网页根据输入的参数动态构造要执行的SQL。例如,如果用户为Business Unit输入1,我们将构建如下SQL: SELECT * FROM FACT WHERE BUSINESS_UNIT = '1' --AND other criteria based on the input params 我发现,如果用户未指定业务单元,则会构造以下查询 SELECT * FROM FACT WH

我们有一个web应用程序,其中用户根据输入的参数执行特殊查询。我还可以提到,响应时间对用户来说非常重要

网页根据输入的参数动态构造要执行的SQL。例如,如果用户为Business Unit输入1,我们将构建如下SQL:

SELECT * FROM FACT WHERE 
BUSINESS_UNIT = '1'
--AND other criteria based on the input params
我发现,如果用户未指定业务单元,则会构造以下查询

SELECT * FROM FACT WHERE 
BUSINESS_UNIT LIKE '%'
--AND other criteria based on the input params
IMHO,这是不必要的,如果不是非常低效的话,并且保证发送代码不利于修改,但是因为我比其他人发送代码进行返工的比率要高得多,我相信我可能会因为过于挑剔而赢得声誉

如果这是一个不合适的问题,因为它不是一个直接编码Q,让我知道,我会立即删除它。我很困惑这样的主观问题是否被允许!我会关注你的回复

更新:

我正在使用Oracle数据库


我的印象是,Oracle不会像“%”那样通过删除条件进行优化,而将其保留在中会降低效率。有人能确认一下吗?

我会把它寄回去,我喜欢这个问题

所有的代码审查在某种程度上都是主观的。标准应基于若干因素

它有用吗

它是否满足性能、可维护性、可用性和可伸缩性的合理期望

虽然我还没有测试这个特定的构造,但我怀疑这段代码会对SQL server造成可怕的影响。因此,性能和可伸缩性受到质疑。

使用“%”这样的业务单元的查询看起来效率不高-我想它将强制对表进行完整扫描


所以,是的,我会尝试重新处理该查询,以适当的方式处理这种情况-或者,至少,我会通过我们的bug追踪器报告该问题,不确定我将分配的优先级,但是,尽管如此,该问题仍会记录在某个地方,总有一天会有人纠正它,当没有更高优先级的问题需要处理时。

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

换句话说,

SELECT * FROM FACT WHERE 
BUSINESS_UNIT LIKE '%'

生成了完全相同的查询计划。因此,我想,根据DB引擎的不同,应该不会有性能上的差异,尽管它看起来确实有点邋遢


这可能会影响您是否将其发回的决定。就我个人而言,我可能会这样做,但如果你已经被蒙在鼓里,那么你可能会放松下来,至少在性能方面是这样。

作者想要一个虚拟语句,以便他/她可以在所有后续语句中附加和。将其更改为更好的无操作语句(如1==1)会有所帮助。或者他们可以做更多的工作,智能地插入where。

SELECT*是一个红色标志。指定查询的列列表。

这两个查询与结果集的视图完全不同

SELECT * FROM FACT;

第一个将返回所有行,第二个,如果存在NULL值,则不会返回这些行,因为与NULL相比的任何内容都是NULL,因此不满足谓词。这就是它在Oracle中的工作方式。

我会质疑为什么不使用绑定变量,除非在特定情况下有充分的理由:

SELECT * FROM FACT WHERE 
BUSINESS_UNIT = '1'
为什么不是:

SELECT * FROM FACT WHERE 
BUSINESS_UNIT = :bu

你知道还有谁太挑剔了吗?正如您从Womp的回答中所看到的,在这种情况下,您不需要将代码发回,因为大多数SQL查询优化器将有效地处理这个示例。然而,我很好奇开发人员是否知道它会以这种方式进行优化。打败我,在我的机器上刚刚完成测试,我得出了相同的结论。第一个注意到空的人得到了答案。我相信一些RDBMS处理这个问题的方式不同,这可能就是为什么MS SQL Server可以优化它,而Oracle显然不能,除非列为非空
SELECT * FROM FACT WHERE 
BUSINESS_UNIT = '1'
SELECT * FROM FACT WHERE 
BUSINESS_UNIT = :bu