2014-04-22 26 views
0

我有一些執行oracle調用的代碼。我想知道如果我正在嘗試這樣做的方式可以做得更好,或者如果oracle代碼可以更高效。優化JSTL和ORACLE查詢的創建和運行時間

我的主要關注點是對UPPER('%Variable%')進行比較。鞋面內的外卡似乎有潛在的危險緩慢。

結果可能會返回超過5萬個結果(預計未來會大量增加)。

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}"/> 

任何幫助將不勝感激。謝謝

回答

0

在網上進行了一些深入研究後,我最終做了什麼,我刪除了UPPER和通配符的所有用法。

通過始終存在通配符(主要是前導通配符),它將刪除索引的使用並使其始終存在全表掃描,即使不需要時也是如此。另一種方法是使用conText索引,但它們似乎不適合我當前的應用程序。

通過刪除上方我只是簡單地使搜索過濾器區分大小寫,其中,在環顧公司網站後,大多數搜索過濾器區分大小寫。

通過刪除通配符我只需強制用戶必須將它們輸入到搜索過濾器本身。 (這將是一個非常危險的sql注入地點,但該項目僅供內部使用)

我最終保持1 = 1以保持代碼簡單(它允許我所有條件以AND語句開頭而不必檢查是否存在其他條件。