`

在数据分布严重不均的列上使用绑定变量容易错过更好的执行计划

 
阅读更多

在数据分布严重不均的列上使用绑定变量容易错过更好的执行计划,原因在于9i引入bind peeking机制导致的。

SQL> desc tt
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)

SQL> select count(*) from tt;

COUNT(*)
----------
46080

SQL> update tt set object_id=999 where object_id>5;

已更新46064行。

SQL> commit;

提交完成。

SQL> create index idx_tt on tt(object_id) tablespace users;

索引已创建。

SQL> set autotrace traceonly
SQL> variable i number
SQL> exec :i := 2;

PL/SQL 过程已成功完成。

SQL> set linesize 200
SQL> select * from tt where object_id=:i;


执行计划
----------------------------------------------------------
Plan hash value: 6977672

--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 548 | 96996 | 22 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TT | 548 | 96996 | 22 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_TT | 219 | | 19 (0)| 00:00:01 |
--------------------------------------------------------------------------------------

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

2 - access("OBJECT_ID"=TO_NUMBER(:I))

Note
-----
- dynamic sampling used for this statement


统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
1472 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
4 rows processed

SQL> exec :i := 999;

PL/SQL 过程已成功完成。

SQL> select * from tt where object_id=:i;

已选择46064行。


执行计划
----------------------------------------------------------
Plan hash value: 6977672

--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 548 | 96996 | 22 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TT | 548 | 96996 | 22 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_TT | 219 | | 19 (0)| 00:00:01 |
--------------------------------------------------------------------------------------

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

2 - access("OBJECT_ID"=TO_NUMBER(:I))

Note
-----
- dynamic sampling used for this statement


统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
6774 consistent gets
98 physical reads
0 redo size
4572424 bytes sent via SQL*Net to client
34155 bytes received via SQL*Net from client
3072 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
46064 rows processed

SQL> select * from tt where object_id=2;


执行计划
----------------------------------------------------------
Plan hash value: 6977672

--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 708 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TT | 4 | 708 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_TT | 4 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------

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

2 - access("OBJECT_ID"=2)

Note
-----
- dynamic sampling used for this statement


统计信息
----------------------------------------------------------
9 recursive calls
0 db block gets
89 consistent gets
0 physical reads
0 redo size
1472 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
4 rows processed

SQL> select * from tt where object_id=999;

已选择46064行。


执行计划
----------------------------------------------------------
Plan hash value: 264906180

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 54823 | 9476K| 253 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| TT | 54823 | 9476K| 253 (1)| 00:00:04 |
--------------------------------------------------------------------------

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

1 - filter("OBJECT_ID"=999)

Note
-----
- dynamic sampling used for this statement


统计信息
----------------------------------------------------------
9 recursive calls
0 db block gets
4248 consistent gets
0 physical reads
0 redo size
1920772 bytes sent via SQL*Net to client
34155 bytes received via SQL*Net from client
3072 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
46064 rows processed

SQL>

分享到:
评论

相关推荐

    C++应用编程200例.rar

    封装则是将数据和操作数据的方法绑定在一起,保护数据不被外部随意访问。 此外,C++还包括模板、异常处理、STL(标准模板库)等进阶主题。模板是实现泛型编程的关键,可以创建适用于多种数据类型的函数或类;异常...

    Visual stdio2010关于c#4和Visual Basic10视频讲座

    这个视频系列旨在帮助初学者和经验丰富的程序员更好地理解和利用Visual Studio 2010的最新功能,特别是在C# 4和Visual Basic 10中的改进。 首先,C# 4是C#语言的一个重要版本,它带来了许多新特性以增强编程的灵活...

    WF编程 译版 中文版

    3. **数据绑定和变量**:阐述如何在WF中处理数据,如使用变量存储信息,以及如何与外部系统进行数据交互。 4. **持久化**:WF支持流程的持久化,即能够将运行中的工作流保存到数据库或文件中,然后在需要时恢复。这...

    android-1.1_r1-windows.zip

    《Android 1.1 开发环境构建与应用详解——基于Windows平台》 Android 1.1,作为Android操作系统的一个早期版本,...虽然Android 1.1已经过时,但了解其工作原理有助于我们更好地理解和应对现代Android开发中的问题。

    tolua++-1.0.93

    通过实践,你可以更好地掌握tolua++的用法,提升C++项目的可扩展性和灵活性。 总的来说,tolua++-1.0.93是C++与lua结合的一个强大工具,它让lua能够方便地访问和控制C++的复杂功能,极大地拓宽了lua在游戏开发、...

    Visual Basic 2005 基础教程

    教程会讲解如何创建数据库连接,执行SQL语句,以及使用数据绑定技术显示和编辑数据。 10. **错误处理和调试**:良好的错误处理和调试技巧能提高代码质量。教程会介绍Try...Catch异常处理结构,以及使用VB2005的调试...

    c++程序练习的100个例子

    首先,C++的基础知识包括语法结构、变量、数据类型、运算符、流程控制(如if语句、switch语句、for循环、while循环)和函数的使用。在这些练习中,新手可以了解如何声明和初始化变量,以及如何运用不同的数据类型...

    VB编程经验手册

    **VB编程经验手册** ...VB编程经验手册详细涵盖了这些知识点,通过深入学习和实践,开发者可以更好地驾驭VB,编写出高效、稳定的程序。无论是初学者还是资深开发者,这份手册都是不容错过的宝贵资料。

    Visual C# 2005技术文档

    5. **ADO.NET**:用于数据库操作,讲解了如何连接数据库、执行SQL查询、数据绑定和事务处理。 6. **LINQ(Language Integrated Query)**:Visual C# 2005引入的新特性,使得在代码中进行数据查询更加简洁和高效。 ...

    Pro C# 2008 and the NET 3.5 Platform Fourth Edition

    C# 2008是微软推出的一种面向对象的编程语言,它在C# 2005的基础上进行了改进和扩展,以更好地支持.NET Framework 3.5。这本书将带你深入理解C# 2008的关键特性,包括但不限于: 1. **基本语法**:介绍C#的基本数据...

    C++小知识(非常不错啊)

    2. 封装:这是面向对象编程的基本原则之一,指的是将数据和操作这些数据的方法绑定在一起,作为一个单元进行处理。通过访问控制(public, protected, private),可以限制对类内部信息的直接访问,提高代码安全性。 ...

    Woll2WollFirePower12.0.4.4(附详细安装说明,感谢群里三位大神).7z

    总的来说,Woll2Woll FirePower 12.0.4.4是Delphi开发者的得力助手,结合详细的安装说明,使得开发者能够更好地利用这一工具集,提升开发效率和代码质量。对于那些希望在Delphi开发领域有所突破的程序员来说,这是一...

    JqueryPPT教程

    通过本教程的学习,您将能够熟练运用jQuery进行网页开发,提升网页的用户体验,同时也能更好地理解和应用JavaScript的高级特性。无论你是前端新手还是有一定经验的开发者,这都是一份不容错过的学习资源。现在,就让...

    javascript函数

    本资料“javascript函数”提供了深入理解和有效使用JavaScript函数的宝贵资源,对于初学者和经验丰富的开发者来说都是一份极好的参考资料。 JavaScript函数基础: 函数在JavaScript中是一种可重复使用的代码块,...

    jsp学习教程,很详细的电子教案

    2. **使用MVC框架**:例如Spring MVC、Struts等,能够更好地组织代码和提高开发效率。 3. **性能优化**:合理使用缓冲区、避免不必要的数据库查询、正确管理会话等,能有效提升JSP应用的性能。 这个“JSP从入门到...

    C#,源代码,文本编辑器

    在IT领域,文本编辑器是开发人员日常工作中不可或缺的工具之一。C#是一种广泛用于创建桌面应用程序、Web应用...通过深入研究并实践这个项目,你将能够更好地理解和运用C#,并可能为自己的开发工作带来新的灵感和方法。

    C#经典范例50讲讲解了许多c#常用的例子

    1. **基础语法**:包括变量声明、数据类型、运算符、控制流(如if-else、switch、循环)以及函数的使用。这些是所有编程语言的基础,对于理解C#的工作原理至关重要。 2. **面向对象编程**:C#是面向对象的语言,...

    C++程序资源下载最爱再次随遇正逢!!!!

    通过实际编程练习,可以更好地理解理论知识,并提升编程技巧。 综上所述,这个资源包可能包含了C++编程的各个方面,包括基础语法、面向对象编程、模板和STL的使用,以及现代C++特性等。无论你是C++的新手还是有经验...

    boost 1.55版本官方pdf

    1. **智能指针**:Boost提供了一套智能指针(smart pointers),如`shared_ptr`、`unique_ptr`和`weak_ptr`,它们能帮助开发者更好地管理对象的生命周期,防止内存泄漏。 2. **容器和算法**:Boost库扩展了C++标准...

    E4A易安卓视频教程源码: - 09、时钟例程.rar

    《E4A易安卓视频教程源码:- 09、时钟例程》 本文将深入探讨在E4A(Easy Android)平台上创建时钟应用程序的教程源码,这是一份非常适合初学者和进阶...所以,认真研究这份源码,是你在E4A学习道路上不容错过的一环。

Global site tag (gtag.js) - Google Analytics