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

常见数据库(Oracle/MySQL)开发中的问题集(续)

阅读更多

常见数据库(Oracle/MySQL)开发中的问题集
    声明:许多内容来自互联网,由于查阅的内容过多,无法能一一给出链接地址,如果有问题,请联系,3q
   
    系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质 SQL语句之间的速度差别可达到上百倍,可见对于一
    个系统不是简单的能实现其功能就可以了,而是要写出高质量的SQL语句,提高系统的可用性。
   
    作为一名程序员,在开发的过程中,不仅仅是关注代码的编码,在与数据库打交道的代码逻辑我们应该需要谨慎的编写,以求避免系统性能的代码或SQL出现。下面是性能影响的排序(以影响程度排序)
    D1    业务逻辑(影响最大)
    D2    数据设计(表结构设计,数据建模)
    D3    应用程序设计(SQL语句的写法)
    -->以上三条都会与作为程序员的我们息息相关的!一个好的程序员,不仅是能编写漂亮的代码,还要有一定的数据设计能力,和优秀的SQL编写能力,即,能知晓如何编写出性能好的SQL语句,能够察觉到SQL语句的写法是否会影响到性能.....(个人拙见,大牛见笑)
    D4  数据库的逻辑结构 (索引,区间,段,表空间)
  D5  数据库操作 (参数和配置)
  D6  访问路径
  D7  内存分配情况
  D8  I/O 和物理设计 (DBA 与业务沟通)(峰值多大,使用周期)
  D9  资源的征用
  D10 操作系统的调节
 
  从上面来看,D1-D3 影响最大但比较难修改 (事先去做),而且责任大部分在程序员肩上。
  一下是可能引起全表扫描的操作
  在索引列上使用NOT或者'<>'
  对索引列使用函数或者计算
  NOT IN操作
  通配符位于查询字符串的第一个字符
  IS NULL或者IS NOT NULL
  多列索引,但它的第一个列并没有被WHERE子句引用
  注:对字段没进行索引的,执行的时候都是全表扫描。
  既然是进行全表扫描,应该如何避免一些性能问题呢?看下面的建议吧!
 
  关注SQL语句中 where 的编写
  多数情况下,Oracle使用索引来更快的遍历表,优化器主要根据定义的索引来提高性能。但是,如果在SQL语句的where子句中写的SQL代码不合理,造成优化器删去索引而使用全表扫描。所以,应清楚优化器根据何种原则来删除索引。
 
  IS NULL 与 IS NOT NULL
  不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样之情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。
  任何在where子句中使用is null或is not null的语句,Oracle会停止使用索引而执行全表扫描。判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。可以考虑在设计表时,对索引列设置为NOT NULL。
  如何避免呢?如:
  1)a is not null 改为 a>0 或a>' '等。
  2)不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。
  ......
 
  IN 与 NOT IN 操作符
     建议:尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替
     IN操作符:Oracle会试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询。若成功就直接采用多个表的连接查询。in就是至少多了一个转换的过程。
     Oracle在执行IN子查询时,首先执行子查询,将查询结果放入临时表再执行主查询。
     而EXIST则是首先检查主查询,然后运行子查询直到找到第一个匹配项。
     推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替
    
     WHERE后面的条件顺序影响
     在条件中都没有建立索引的字段,所以执行的时候都是全表扫描。进行全表扫描,数据量巨大的时候,就会对查询产生直接的影响。
     Oracle从下到上处理Where子句中多个查询条件,所以表连接语句应写在其他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾。
  WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响。
 
  Order By语句中的非索引列会降低性能,可以通过添加索引的方式处理。严格控制在Order By语句中使用表达式
 
 
  关注数据库的N+1查询
 
 
  关注数据库的分页查询
  Oracle
      SELECT *
  FROM (SELECT ROWNUM r,t1.* From 表名称 t1 where rownum < M + N) t2
  where t2.r >= M

  例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:

  SELECT *
  FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2
  Where t2.R >= 10

  MySQL
      SELECT * FROM 表名称 LIMIT M,N
      从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录
      select * from sys_option limit 10,20
     
  SQLServer
      从数据库表中的第M条记录开始取N条记录,利用关键字Top:值得注意的是如果SELECT语句中既有top,又有order by,那么,会从排序好的结果中选择:
      SELECT *
      FROM (SELECT TOP N * FROM
                  (SELECT TOP (M+N-1) * FROM TABLE_NAME ORDER BY 主键 DESC) TBL_1) TBL_2
      ORDER BY 主键 ASC
     
      Example here:(从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录)
      SELECT *
      FROM (SELECT TOP 20 *
      FROM (SELECT TOP 29 * FROM Sys_option ORDER BY sys_id DESC) T1 ) T2
      ORDER BY sys_id ASC
     
     
Oracle工作中遇到的知识总结:

    RONUM:
    rownum是Oracle中的伪列,并不真正存在于表中,它只在查询的时候产生。也就是说表中的数据并没有一个真正的物理的列去表示一条记录是第几行,而只是在查询中才会对这些行进行标识。
    rownum的正确生成时机:rownum是在where条件过滤之后,在任何排序(order by)或聚集(aggregation)之前赋给行的。
    同时,只有当rownum被分配给行后才会递增。rownum的初始值为1。rownum在查询中产生后就不再变化
 
  rownum被分配的过程大致如下:
  rownum = 1
  for x in (select * from one_tbl)
  loop
    if (x satisifies the predicate)then
        output the row
        rownum = rownum + 1
    end if
  end loop
 
  一个查询的执行顺序大概是这样的:
    Select …, ROWNUM
    From t
    Where <where clause>
    Group by <columns>
    Having <having clause>
    Order by <columns>
   
    1.The FROM and WHERE clause go first.
    2.ROWNUM is assigned and incremented to each output row from the FROM or WHERE.
    3.SELECT is applied.
    4.GROUP BY is applied.
    5.HAVING is applied.
    6.It is sorted.
 
  SQL语句:select * from emp where ROWNUM <= 5 order by sal desc 的错误原因:
  该语句的目的是想返回top 5薪水最高的员工信息,但根据rownum的产生原理,rownum在order by之前就已经产生,
  所以该语句并不能起到top 5的作用,正确的语法如下:
  select * from (select * from emp order by sal desc) where ROWNUM <= 5;
     
         
 
   

1
0
分享到:
评论

相关推荐

    数据库驱动集(oracle/mysql/mssqlserver)

    数据库驱动集是连接应用程序与不同...在实际开发中,还需要注意驱动的版本匹配问题,确保所使用的驱动与数据库服务器的版本相兼容,以避免可能出现的兼容性问题。同时,及时更新驱动可以获取最新的性能优化和安全修复。

    java连接oracle/mysql数据库简单示例(附oracle+mysql数据库驱动包)

    在Java编程中,连接Oracle和MySQL数据库是常见的需求,这对于数据操作、数据分析或者构建Web应用程序至关重要。本示例将向你展示如何使用Java API来实现这两个数据库的连接,并且提供了相应的数据库驱动包。 首先,...

    jsp+oracle/mysql源码

    【标题】"jsp+oracle/mysql源码"涉及的是在Web开发中使用Java Server Pages(JSP)技术结合Oracle或MySQL数据库进行数据管理的应用实例。这是一个常见的组合,因为JSP是用于构建动态网页的Java技术,而Oracle和MySQL...

    Java连接各个版本Oracle/Mysql/DB2…数据库代码

    在Java编程中,连接到各种类型的数据库是常见的需求。这里主要涉及的是Oracle、MySQL和DB2这三种数据库,以及提及的SQL Server和Informix。Java提供了JDBC(Java Database Connectivity)API来实现与多种数据库的...

    各种数据库驱动程序 mysql数据库/sqlserver数据库/oracle数据库/sqlserver数据库(JTDS)驱动总结

    本文将对MySQL数据库、SQL Server数据库、Oracle数据库以及使用JTDS驱动的SQL Server数据库进行深入探讨。 #### MySQL数据库驱动 MySQL是全球广泛使用的开源关系型数据库系统之一。为了使Java应用程序能够连接到...

    (sqlserver/oracle/mysql/access/sqlite)数据库操作组件Zhuyi.DBUtility

    Zhuyi.DBUtility是一个数据库操作组件,支持多种常见的关系型数据库系统,包括SQL Server、Oracle、MySQL、Access以及SQLite。这个组件的核心在于提供了一种统一的接口来简化数据库的CRUD(创建、读取、更新和删除)...

    java 连接sql server/Oracle/Mysql等常用数据库方法

    在Java开发中,连接SQL Server、Oracle、MySQL等常见数据库的方法主要有两种:JDBC-ODBC桥接和JDBC直连。这两种方式都是通过Java的JDBC(Java Database Connectivity)API来实现的,允许Java应用程序与各种数据库...

    多种数据库连接配置(oracle\mysql\access)

    本文将深入解析多种数据库连接配置的知识点,包括Oracle、MySQL和Access的连接方式、配置参数以及常见问题解决策略。 ### Oracle数据库连接配置 Oracle数据库以其强大的功能和稳定性被广泛应用于企业级应用中。...

    Oracle/SQLServer/MySQL驱动包下载

    Oracle、SQL Server和MySQL是最常见的三种关系型数据库管理系统(RDBMS),广泛应用于企业级应用、网站开发和数据分析等场景。本资源提供了这三种数据库的JDBC驱动包,方便开发者在Java环境中与数据库进行交互。 1....

    java连接oracle和mysql数据库的jar包

    Java是一种广泛使用的编程语言,尤其在企业级应用中,它经常需要与各种数据库进行交互,如Oracle和MySQL。为了在Java程序中连接到这些数据库,我们需要特定的驱动程序,通常以JAR(Java Archive)文件的形式存在。...

    超级好用的数据库迁移工具(MySQL、Oracle)

    2. **数据转换**:根据目标数据库Oracle的特性,对数据进行必要的格式转换,如字符集转换、字段类型转换等。 3. **数据加载**:将转换后的数据写入Oracle数据库中,确保数据结构和原MySQL数据库一致。 在实际操作中...

    oracle 和mysql数据库的连接池一起下载

    在实际应用中,选择Oracle或MySQL数据库以及其对应的连接池,主要取决于项目需求、性能要求、开发语言支持等因素。例如,Oracle数据库在大型企业级应用中较为常见,其数据处理能力强,适合高并发场景;而MySQL则因为...

    SpringBoot定时任务实现Oracle和mysql数据同步

    在IT行业中,数据库同步是一项常见的需求,特别是在分布式系统或者多数据库环境里。Spring Boot作为Java领域的一个热门微服务框架,提供了强大的定时任务功能,能够帮助我们实现不同数据库间的数据同步,比如Oracle...

    springboot+mysql+oracle+druid 双数据库进行数据同步

    在IT行业中,数据库同步是一个常见的需求,特别是在分布式系统或者数据迁移场景下。本项目主要探讨了如何使用SpringBoot框架结合MySQL和Oracle两个不同的数据库系统,实现数据的实时或定时同步,尤其是在数据量庞大...

    记使用Oracle SQL Developer 迁移MySql 数据至 Oracle.docx

    在IT领域,数据库迁移是一项常见的任务,特别是在不同的数据库系统之间,如从MySQL迁移到Oracle。本文将详细讲解如何使用Oracle SQL Developer工具进行这样的迁移过程,以及如何解决在迁移过程中遇到的问题。 首先...

    数据库驱动Mysql + Oracle

    在本主题中,我们主要关注两种常用的数据库系统:MySQL和Oracle,以及它们对应的Java数据库连接(JDBC)驱动。 **MySQL数据库驱动** MySQL是一种开源、关系型数据库管理系统,广泛应用于Web应用、小型到大型企业...

    如何连接MySQL-Oracle数据库

    #### 其他常见数据库连接 除了 MySQL 和 Oracle 之外,还有其他一些常用数据库的连接方式: 1. **ODBC Bridge**:通过 ODBC 连接各种数据库。 - **驱动程序类**: ``` sun.jdbc.odbc.JdbcOdbcDriver ``` - ...

    java数据库驱动 oracle mysql sqlserver oracle pointbase

    综上所述,这个压缩包提供的Java数据库驱动涵盖了四种常见的数据库系统,可以满足开发人员在多种环境下进行数据操作的需求。同时,附带的测试程序可以帮助开发者快速验证和理解如何在Java项目中正确使用这些驱动。

    OracleToMysql转换器

    OracleToMysql转换器是一款专为数据库管理员设计的实用工具,旨在实现从Oracle数据库到Mysql数据库的数据迁移。这个工具能够高效地处理不同数据库结构之间的转换,确保在切换过程中数据的完整性和一致性。 Oracle...

Global site tag (gtag.js) - Google Analytics