`
a3mao
  • 浏览: 562935 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL语句主要的连接方法

    博客分类:
  • Work
阅读更多
一篇很好的文章,关于sql查询优化的,收益非浅啊。。
原文地址:http://www.blogjava.net/Titan/articles/24430.html

SQL语句主要的连接方法

a) Nested-loop join
适合于小表(几千条,几万条记录)与大表做联接
在联接列上有索引。

分内表和外表(驱动表),靠近from子句的是内表。从效率上讲,小表应该作外表,大表应该作内表,即大表查询时走索引。

COST= Access cost of A(驱动表) + (access cost of B * number of rows from A)

成本计算方法:
设小表100行,大表100000行。

两表均有索引:
如果小表在内,大表在外(驱动表)的话,则扫描次数为:
100000+100000*2 (其中2表示IO次数,一次索引,一次数据)
如果大表在内,小表在外(驱动表)的话,则扫描次数为:
100+100*2.

两表均无索引:
如果小表在内,大表在外的话,则扫描次数为:
100000+100*100000
如果大表在内,小表在外的话,则扫描次数为:
100+100000*100

注意:如果一个表有索引,一个表没有索引,ORACLE会将没有索引的表作驱动表。如果两个表都有索引,则外表作驱动表。如果两个都没索引的话,则也是外表作驱动表。

基本的执行计划如下所示:
NESTED LOOPS
           TABLE ACCESS (BY ROWID)  OF  our_outer_table
                   INDEX (..SCAN) OF outer_table_index(….)
           TABLE ACCESS (BY ROWID)  OF  our_inner_table
             INDEX (..SCAN) OF inner_table_index(….)

b) Hash join

适合于大表与大表,小表(几十万,几百万)与大表之间的联连。
联接列上不需要索引。

基本执行计划如下:
HASH JOIN
              TABLE ACCESS (….)  OF  tableA
              TABLE ACCESS (….)  OF  tableB

cost= (access cost of A * number of hash partitions of B) + access cost of B

可以看出主要成本在于A表是否可以被Cache。Hash_area_size的大小将决定Hash Join的主要成本。可以看出Hash Join的成本和返回集合并没有直接的关系,所以当返回结果集比较大的时候一般具有较好的性能。

为了加快hash join的速度,可以调大hash_area_size和pga_aggregate_target(默认为25M)的值。


c) Sort Merge join

每一个Row Source在Join列上均排序。
然后两个排序后的Row Source合并后,作一个结果集返回。
Sort/Merge Join仅仅对equal Join有效。

基本执行计划
MERGE (JOIN)
        SORT (JOIN)
                 TABLE ACCESS (….)  OF  tableA
        SORT (JOIN)
                 TABLE ACCESS (….)  OF  tableB

cost= access cost of A + access cost of B +(sort cost of A + sort cost of B)

可以看出Sort的成本是Merge Join的主要构成部分。这样sort_area_size的大小将很大程度决定Merge Join的大小。同样如果A表或者B表已经经过排序的,那么Merge Join往往具有很好的性能。其不会走索引。

没有驱动表的概念,即时响应能力较差。

分享到:
评论

相关推荐

    java执行SQL语句实现查询的通用方法详解

    本文主要介绍了java执行SQL语句实现查询的通用方法详解,具有一定借鉴价值,需要的朋友可以参考下。 一、Java执行SQL语句实现查询的通用方法详解 在Java中执行SQL语句实现查询是非常常见的操作,以下是Java执行SQL...

    Oracle Sql语句转换成Mysql Sql语句

    本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。 Oracle SQL与MySQL SQL的主要差异在于以下几个方面: 1. **数据类型**:Oracle支持的数据类型如NUMBER、LONG、RAW等在...

    查看LINQ生成SQL语句的几种方法

    Visual Studio的SQL Server Object Explorer工具提供了一个直观的方式来查看连接到的数据库并监视执行的SQL语句。在运行LINQ查询时,可以通过该工具实时查看到生成的SQL。 4. **Entity Framework SQL Server Query...

    动态拼接sql语句工具类,拼接where后面语句

    动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...

    SQL语句拼接工具,简化SQL语句拼写代码

    标题中的“SQL语句拼接工具”是指一种软件开发辅助工具,它的主要功能是自动化生成SQL语句,特别是在处理参数化的查询时。这种工具通常具有模板化和参数化的特性,允许开发者定义查询模板,然后将变量替换为实际值,...

    hibernate执行原生sql语句

    "hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...

    Java打印漂亮的SQL语句(被格式化的SQL语句)

    另一个标签"SQL格式化"则明确了它的主要功能,即整理SQL语句的结构,使其更具可读性。"优美的SQL语句"则暗示了经过格式化后的SQL会更加整洁,便于理解和审查。 压缩包中的"PrettySQLFormatter.jar"是预编译的Java...

    sql语句命令-sql语句命令sql语句命令

    在开发数据库应用程序时,SQL语句是至关重要的工具,用于查询、插入、更新和删除数据库中的数据。本文将深入探讨SQL语句命令及其在数据库操作中的应用,特别是使用ADO.NET框架进行数据库交互。 首先,我们需要了解...

    oracle监听执行sql语句

    这条SQL语句通过连接`v$session`和`v$sqlarea`两个视图来获取当前会话中执行的SQL语句及其完整文本。其中`v$session`包含了所有活动会话的信息,而`v$sqlarea`则存储了最近执行过的SQL语句的元数据。通过`a.sql_...

    易语言动态拼接sql语句

    动态拼接SQL语句的主要目的是为了提高程序的灵活性,使得可以根据不同的条件或参数生成不同的查询。在易语言中,这通常通过字符串操作函数实现,如“+”用于连接字符串,以及“%”用于格式化字符串。例如,我们可以...

    oracle利用批处理文件执行SQL语句,bat连接oracle数据库并执行语句

    接下来,我们可以编写SQL语句来执行各种操作。例如,删除用户可以使用`DROP USER`语句: ```sql DROP USER 用户名 CASCADE; ``` `CASCADE`关键字确保与该用户相关的所有对象(如表、索引等)也将被删除。 创建用户...

    开发sql语句拼接自动格式化工具

    SQL语句格式化工具是一种非常实用的开发辅助软件,它主要解决了在编写和维护大量SQL代码时遇到的格式混乱和拼接困难的问题。通过这款工具,开发者可以快速地将大段的SQL语句进行自动格式化,使得代码更加清晰、易读...

    Java 使用注解拼接SQL语句

    例如,我们可以根据方法参数动态决定SQL语句的条件部分。这在处理复杂查询或动态过滤时特别有用,避免了大量硬编码的字符串拼接。 4. **性能与安全性**: 动态SQL可以提高代码的灵活性,但也有性能考虑。因为每次...

    自动生成SQL语句_C#_sql_

    C#的string类提供了丰富的字符串操作方法,如StringBuilder,可用于高效地构造复杂的SQL语句。同时,使用SqlParameter来传递参数,可以防止SQL注入攻击。 四、动态SQL与存储过程 1. 动态SQL:在C#中,你可以使用...

    连接sqlserver数据库,批量执行sql语句

    在本案例中,我们关注的是使用VC++和MFC(Microsoft Foundation Classes)库连接到SQL Server数据库并批量执行SQL语句的过程。下面将详细介绍这个过程涉及的关键知识点。 首先,`VC++`是微软开发的一款集成开发环境...

    C#将Lambda表达式转成Sql语句

    然而,在某些情况下,我们需要将这些表达式转换为实际的SQL语句,以便在数据库中执行。本文将深入探讨如何实现这一过程。 首先,我们需要了解Lambda表达式的基本结构。Lambda表达式通常以参数列表开始,后面跟着一...

    SQL语句拼接

    尽管使用`StringBuffer`拼接SQL语句是一种简单有效的方法,但它也存在一些潜在的安全隐患,尤其是在处理用户输入时。例如,如果用户提交恶意输入,可能会导致SQL注入攻击。为了避免这种情况的发生,建议采用以下措施...

    SQL语句辅助工具

    SQL语句包括SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)等基本操作,还有JOIN(连接)、GROUP BY(分组)、HAVING(分组后的条件过滤)等高级功能。 C#,另一方面,是微软公司推出的一种面向...

    完成超长SQL语句执行前拆分

    为了克服这一限制,本文介绍了一个专门用于将超长SQL语句拆分为多个较小SQL语句的方法。 #### 核心功能解析 ##### 函数定义 该方法通过一个名为`splitSql`的函数实现。其功能是接收三个参数: - `SqlStr`:需要被...

    SQL 执行超长语句

    在数据库管理与开发过程中,编写SQL语句是必不可少的一环。有时,我们可能会遇到需要执行非常长的SQL语句的情况。这些超长语句可能由于包含大量的条件、子查询或是数据量较大等原因而变得异常复杂。本文将围绕“SQL...

Global site tag (gtag.js) - Google Analytics