Oracle - 在where子句中使用filter函数时的语句顺序是什么

时间:2016-07-22 04:23:14

标签: oracle performance plsql query-optimization

使用列(ID,QueueTypeId,CreateDateTime,WorkId,InQ,OutQ)引用表WORKQUEUELOG

有一个索引可用于(QueueTypeId,CreateDateTime,Id)

当尝试使用以下查询读取前X个记录时,它将进行全表搜索。

OPEN a_CursorHandle FOR 
    SELECT * FROM ( 
        SELECT * FROM WORKQUEUELOG tbl
           WHERE EX_CLS_WQLOG.FILTER(
                tbl.QueueTypeId,
                tbl.CreateDateTime,
                NULL) = 1  
           AND EX_CLS_WQLOG.VALIDATION(
               tbl.ID                       ,
               tbl.WorkId                   ,
               tbl.InQ     ) = 1
           ORDER BY tbl.QueueTypeId ASC,tbl.CreateDateTime ASC,tbl.Id ASC) 
    WHERE ROWNUM <= a_MaxCount;

我们将查询更改为以下内容并开始使用索引进行读取。 即Validaiton函数优先,过滤函数第二。

OPEN a_CursorHandle FOR 
    SELECT * FROM ( 
        SELECT * FROM WORKQUEUELOG tbl
           WHERE EX_CLS_WQLOG.VALIDATION(
               tbl.ID ,
               tbl.WorkId,
               tbl.InQ  ) = 1 
           AND EX_CLS_WQLOG.FILTER(
                tbl.QueueTypeId,
                tbl.CreateDateTime,
                NULL) = 1  
           ORDER BY tbl.QueueTypeId ASC,tbl.CreateDateTime ASC,tbl.Id ASC) 
    WHERE ROWNUM <= a_MaxCount;

在oracle中处理SQL语句的顺序是什么?从左到右或从右到左。 从上面的例子来看,这似乎是从右到左。这是一种一贯的行为。有没有其他有效的方法来编写此查询。

0 个答案:

没有答案