English 中文(简体)
关于“按顺序排列”和“LIKE”条款的绩效分析
原标题:Performance tuning about the "ORDER BY" and "LIKE" clause

我有2个表格,有多个记录(见表A和表B有大约3 000 000份记录)。 vr2_input is a varchar content criteria into by theuser, and 我想得到最大的200“date Field”s Table 显示现场的纪录,如vr2_input 。 2个表格合并如下:

select * from(   
   select * from 
        TableA join TableB on TableA.id = TableB.id
        where  TableA.stringField like  vr2_input  ||  % 
        order by  TableA.dateField desc   
) where rownum < 201

问题是缓慢的,我总结说,这是因为“类似”和“按顺序排列”涉及全桌扫描。 然而,我找不到解决问题的办法。 我如何调整这种结构? 我已经制定了表A.外地和表A.日期指数。 外地,但我如何在选择说明中使用指数特征? 数据库为10g。 感谢!

最新情况:我使用建议,只选择我想要和操作解释计划的领域。 大约4名排雷人员完成询问。 IX_TableA_string 外地是表A.srv_ref外地的指数名称。 我再次提出解释性计划,但没有说明,解释性计划也取得了相同结果。

EXPLAIN PLAN FOR
    select * from(
         select   
                 /*+ INDEX(TableB IX_TableA_stringField)*/ 
                  TableA.id,
                    TableA.stringField,
                    TableA.dateField,
                    TableA.someField2,
                   TableA.someField3,
            TableB.someField1,
            TableB.someField2,
            TableB.someField3,
                    from TableA 
                    join TableB  on  TableA.id=TableB.id
                    WHERE TableA.stringField  like  21 || %   
                 order by TableA.dateField  desc
        ) where rownum < 201

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                            
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
Plan hash value: 871807846                                                                                                                                                                                                                                                                    

--------------------------------------------------------------------------------------------------------                                                                                                                                                                           
| Id  | Operation                       | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                      
--------------------------------------------------------------------------------------------------------                                                                                                                                                                           
|   0 | SELECT STATEMENT                |                      |   200 | 24000 |  3293   (1)| 00:00:18 |                                                                                                                                                                   
|*  1 |  COUNT STOPKEY                  |                      |       |       |            |          |                                                                                                                                                                                   
|   2 |   VIEW                          |                      |  1397 |   163K|  3293   (1)| 00:00:18 |                                                                                                                                                                             
|*  3 |    SORT ORDER BY STOPKEY        |                      |  1397 | 90805 |  3293   (1)| 00:00:18 |                                                                                                                                                              
|   4 |     NESTED LOOPS                |                      |  1397 | 90805 |  3292   (1)| 00:00:18 |                                                                                                                                                                      
|   5 |      TABLE ACCESS BY INDEX ROWID| TableA       |  1397 | 41910 |   492   (1)| 00:00:03 |                                                                                                                                                 
|*  6 |       INDEX RANGE SCAN          | IX_TableA_stringField |  1397 |       |     6   (0)| 00:00:01 |                                                                                                                                                         
|   7 |      TABLE ACCESS BY INDEX ROWID| TableB      |     1 |    35 |     2   (0)| 00:00:01 |                                                                                                                                                      
|*  8 |       INDEX UNIQUE SCAN         | PK_TableB   |     1 |       |     1   (0)| 00:00:01 |                                                                                                                                                            
--------------------------------------------------------------------------------------------------------                                                                                                                                                                           

Predicate Information (identified by operation id):                                                                                                                                                                                                                                      
---------------------------------------------------                                                                                                                                                                                                                                             

   1 - filter(ROWNUM<201)                                                                                                                                                                                                                                                                      
   3 - filter(ROWNUM<201)                                                                                                                                                                                                                                                                      
   6 - access("TableA"."stringField" LIKE  21% )                                                                                                                                                                                                                                                 
       filter("TableA"."stringField" LIKE  21% )                                                                                                                                                                                                                                                     
   8 - access(TableA"."id"="TableB"."id")       
问题回答

你们说,花了4分钟时间来回答问题。 EXPLAIN PLAN产出显示,估计数为18秒。 因此,在这一案例中,优化者可能远远超出其某些估计数。 (它仍然可以选择尽可能最好的计划,但可能不是。)

类似情况的第一步是获得实际执行计划和统计数字。 页: 1

这将显示实际执行计划,每个步骤都将显示估计增长、实际增长和实际时间。 将产出摆在这里,也许我们可以就你的问题说出更有意义的东西。

如果没有这一信息,我的建议是试图推翻以下质疑。 我认为,这是相当的,因为身份证似乎是表B的主要钥匙。

select TableA.id,
       TableA.stringField,
       TableA.dateField,
       TableA.someField2,
       TableA.someField3,
       TableB.someField1,
       TableB.someField2,
       TableB.someField3,
  from (select * from(
         select   
                  TableA.id,
                    TableA.stringField,
                    TableA.dateField,
                    TableA.someField2,
                    TableA.someField3,
                    from TableA 
                    WHERE TableA.stringField  like  21 || %   
                 order by TableA.dateField  desc
          )
          where rownum < 201
       ) TableA
       join TableB  on  TableA.id=TableB.id

您是否需要选择所有一栏(*)? 如果选择所有栏目,最优化器将更有可能完全扫描。 如果你需要产出的所有栏目,那么你可能最好从你的角度挑选出该栏,然后加入选择其他栏目,该栏可采用索引调查。 为这两种情况制定解释性计划,以了解最佳者正在做些什么。

编制外地和日期指数 外地栏目。 汽车发动机自动使用。

select id from(   
   select /*+ INDEX(TableB stringField_indx)*/ TableB.id from 
        TableA join TableB on TableA.id = TableB.id
        where  TableA.stringField like  vr2_input  ||  % 
        order by  TableA.dateField desc   
) where rownum < 201

next:

SELECT * FROM TableB WHERE id iN( id from first query)

请寄送本表的状态和数据。

如果你有足够的记忆,你可以 h问如何使用散射。 请附上解释性计划。

记录的数量 表1 如果在较小的表格中排出,则可以选择在表格上,然后排在表B记录中,因为选择和类型都在表A中。

一项很好的试验是,如果允许的话,取消加入并测试速度;201 作为主要问题的一项内容和条款。 此时此刻,有可能把所有各行都退回到外部盘问中去,然后让它破碎?

为了优化类似前提,你可以制定背景指数,使用中包含条款。

查阅: rel=“nofollow” http://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm

增 编

你们可以在表格A上设定一个功能指数。 这将根据情况归还1或0。 该指数将使查询速度更快。 职能逻辑将是

if (substr(TableA.stringField, 1, 9) =  vr2_input 
THEN 
    return 1;
else 
    return 0;

使用实际栏目而不是“*”可能有助于。 至少应删除普通列名。





相关问题
Export tables from SQL Server to be imported to Oracle 10g

I m trying to export some tables from SQL Server 2005 and then create those tables and populate them in Oracle. I have about 10 tables, varying from 4 columns up to 25. I m not using any constraints/...

Connecting to Oracle 10g with ODBC from Excel VBA

The following code works. the connection opens fine but recordset.recordCount always returns -1 when there is data in the table. ANd If I try to call any methods/properties on recordset it crashes ...

How to make a one to one left outer join?

I was wondering, is there a way to make a kind of one to one left outer join: I need a join that matches say table A with table B, for each record on table A it must search for its pair on table B, ...

Insert if not exists Oracle

I need to be able to run an Oracle query which goes to insert a number of rows, but it also checks to see if a primary key exists and if it does, then it skips that insert. Something like: INSERT ALL ...

How can I store NULLs in NOT NULL field?

I just came across NULL values in NOT-NULL fields in our test database. How could they get there? I know that NOT-NULL constraints can be altered with NOVALIDATE clause, but that would change table s ...

Type reference scope

I m studying databases and am currently working on a object-relational DB project and I ve encountered a small problem with the number of possible constraints in an object table. I m using "Database ...

OracleParameter and DBNull.Value

we have a table in an Oracle Database which contains a column with the type Char(3 Byte). Now we use a parameterized sql to select some rows with a DBNull.Value and it doesn t work: OracleCommand ...

热门标签