【问题标题】:Optimize JSTL and ORACLE query creation and run time优化 JSTL 和 ORACLE 查询的创建和运行时间
【发布时间】:2014-04-24 14:15:29
【问题描述】:

我有一些执行 oracle 调用的代码。我想知道我尝试这样做的方式是否可以做得更好,或者 oracle 代码是否可以更有效。

我主要关心的是对UPPER('%Variable%') 进行比较。鞋面内的通配符似乎有潜在危险的缓慢。

结果可以返回超过 50k 个结果(预计未来会大幅增长)。

1=1 的目的只是为了使其余代码更简单,并认为它不会对 sql 造成太大伤害。

<c:set var="sqltext">
    SELECT var1, var2, var3 from var_table
    WHERE 1=1
    <c:if test="${!empty param.var1}"> AND UPPER(var1) LIKE UPPER('%${param.var1}%')</c:if>
    <c:if test="${!empty param.var2}"> AND UPPER(var2) LIKE UPPER('%${param.var2}%')</c:if>
    <c:if test="${!empty param.var3}"> AND var3 = '${param.var3}'</c:if>
</c:set>
<sql:query var="data" dataSource="mydatasource" sql="${sqltext}"/>

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: oracle optimization jstl query-optimization


    【解决方案1】:

    在网上进行了彻底的研究后,我最终做了什么,我删除了 UPPER 和通配符的所有用法。

    通过始终存在通配符(主要是前导通配符),它消除了索引的使用并使其始终存在全表扫描,即使在没有必要时也是如此。另一种方法是使用 conText 索引,但它们似乎不适合我当前的应用程序。

    通过删除上部,我只是让搜索过滤器区分大小写,其中,在浏览公司网站后,大多数搜索过滤器都是区分大小写的。

    通过删除通配符,我只是强制用户必须自己将它们输入到搜索过滤器中。 (这对于sql注入来说会是一个非常危险的地方,但是项目仅供内部使用)

    我最终保持 1=1 以保持代码简单(它允许我的所有 if 条件以 AND 语句开头,而不必检查是否存在另一个条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      相关资源
      最近更新 更多