热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java面试总结(八)——SQL优化、SQL军规、隐式转换

SQL优化对查询进行优化,要尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。任何在Orderby语句的非索引项或者有计算表达式都将降低查询速

SQL优化

  1. 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度

  2. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如select id from t where num is null。任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。

  3. 最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.NULL值也是可能会需要占用空间的,一些定长的数据类型即使数据为NULL也是会占用空间的。

  4. 应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。

  5. 应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,可以使用union/union all 代替

  6. in 和 not in 也要慎用,否则会导致全表扫描。一般情况下,当你IN中的条件太多,或是无法估计时,优化器倾向于全表扫描。当IN的条件少时,如果优化器认为,INDEX SEEK可以带来好处时,照样会走索引的。至于in到底会不会走索引,这个众说纷纭,网上有一种说法:(1)A IN(值列表)肯定用索引、(2)A in (子查询) 是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引。但是第一种有个情况,就是如果一个列的值只有有限的几种,那么A IN (值列表)也是不会使用索引的,因为这种情况,全表扫描比走索引快,优化器会选择走全表扫描的。至于not in 是一个反向查询,是不会走索引的。

  7. 慎用like用于模糊查询,因为其可能导致全表扫描,使用like语句,仅仅后模糊查询是可以走索引的(如:like '56%'),但是前模糊查询会全表扫描(如like '%we' 或 like '%we%')

  8. 如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:select id from t where num = @num 可以改为强制查询使用索引:select id from t with(index(索引名)) where num = @num

  9. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where num/2 = 100可以改为select id from t where num = 100*2

  10. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where datediff(day,createdate,’2005-11-30′) = 0

  11. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

  12. 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

  13. Update 语句,如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志

  14. 对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差

  15. select count(*) from table;这样不带任何条件的count会引起全表扫描,并且没有任何业务意义,是一定要杜绝的。

  16. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过5个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。

  17. 应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。

  18. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

  19. 尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

  20. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

  21. 尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

  22. 避免频繁创建和删除临时表,以减少系统表资源的消耗。临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件, 最好使用导出表。

  23. 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

  24. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

  25. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

  26. 使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。

  27. 与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时 间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。

  28. 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。

  29. 尽量避免大事务操作,提高系统并发能力。如果你需要在一个在线的网站上去执行一个大的 DELETE 或 INSERT 查询,你需要非常小心,要避免你的操作让你的整个网站停止响应。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了。

  30. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

  31. 对多条数据的操作,能尽量批量操作的就批量操作,减少sql的数量。每一个sql都是一个数据库连接

  32. 查询语句执行顺序(只在基于规则的优化器中有效):

    • from子句:执行顺序从后向前,从右向左。数据量较少的表尽量放后面
    • where子句:执行顺序自下而上、从右向左。将能过滤掉最大数据记录的条件卸载where子句的最后面
    • group by子句:执行顺序从左往右分组,最好在group by 前使用where将不需要的记录过滤掉
    • having子句:比较消耗资源,尽量少用,HAVING会在检索出所有记录后才对结果集进行过滤,需要排序等操作
    • select 子句 :少用*号,尽量取字段名称。
    • order by子句:执行顺序从左到右
  33. 避免数据类型不一致,即在比较时,避免比较的字段与数据类型不一致,因为这样可能会发生隐式的类型转换,如果数据列类型被隐式转换了,那么即使其有索引,也是不能够使用的。可以看下面的隐式类型转换规则。

  34. 读取适当的记录LIMIT M,N

  35. 避免在select子语句中使用子查询

  36. 对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。如:select * from employss where first_name||”||last_name =’Beill Cliton'

  37. 使用DECODE函数来减少处理时间: 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.

  38. 整合简单,无关联的数据库访问: 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)

  39. 尽量多使用COMMIT: 只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:,COMMIT所释放的资源::

    • 回滚段上用于恢复数据的信息.
    • 被程序语句获得的锁
    • redo log buffer 中的空间
    • ORACLE为管理上述3种资源中的内部花费
  40. 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.

  41. 减少对表的查询: 在含有子查询的SQL语句中,要特别注意减少对表的查询.例子: SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)

  42. 使用表的别名(Alias): 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.

  43. 用EXISTS替代IN、用NOT EXISTS替代NOT IN: 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.

  44. 用索引提高效率: 索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的.: ALTER INDEX REBUILD

  45. 用EXISTS替换DISTINCT: 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果如:(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D.DEPT_NO = E.DEPT_NO (高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X’ FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);

  46. sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行

  47. 避免在索引列上使用计算:如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描.

  48. 避免在索引列上使用NOT:当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.

  49. 用>=替代> ;用IN来替换OR ;用UNION替换OR;用UNION-ALL 替换UNION ( 如果有可能的话);用WHERE替代ORDER BY

  50. 总是使用索引的第一个列: 如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引

  51. a如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.;在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!

  52. 不要给类似“性别”列创建索引(即整个列的值只有一两种,十几种的) ,像这种情况的列,一般不会走索引,即便在列上创建了索引,因为这种情况全表扫描还要快于利用索引,优化器会选择性的选择走全表扫描,比如一个列只有四种值a,b,c,d,你用in(‘a’,’b’),这种就不会走索引。

  53. 避免改变索引列的类型:当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. 
    假设 EMPNO是一个数值类型的索引列. 
    SELECT … FROM EMP WHERE EMPNO = ‘123′ 
    实际上,经过ORACLE类型转换, 语句转化为: 
    SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123′) 
    幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变. 
    现在,假设EMP_TYPE是一个字符类型的索引列. 
    SELECT … FROM EMP WHERE EMP_TYPE = 123 
    这个语句被ORACLE转换为: 
    SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123 
    因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型 .

  54. 使用事务:请使用事务,特别是当查询比较耗时。如果系统出现问题,这样做会救你一命的。一般有些经验的程序员都有体会—–你经常会碰到一些不可预料的情况会导致存储过程崩溃。

  55. 尽量不要使用TEXT数据类型:除非你使用TEXT处理一个很大的数据,否则不要使用它。因为它不易于查询,速度慢,用的不好还会浪费大量的空间。一般的,VARCHAR可以更好的处理你的数据。

  56. 尽量不要使用临时表:尽量不要使用临时表,除非你必须这样做。一般使用子查询可以代替临时表。使用临时表会带来系统开销,如果你是用COM+进行编程,它还会给你带来很大的麻 烦,因为COM+使用数据库连接池而临时表却自始至终都存在。SQL Server提供了一些替代方案,比如Table数据类型

数据库军规

注:军规主要适用于那些大企业,有着并发量大、数据量大的互联网业务。这类业务架构设计的重点往往是吞吐量,性能优先,对数据库性能影响较大的数据库特性较少使用。这类场景的架构方向是“解放数据库CPU,把复杂逻辑计算放到服务层”,服务层具备更好的扩展性,容易实现“增机器就扩充性能”,数据库擅长存储与索引,勿让数据库背负过重的任务。

  1. 必须使用UTF8字符集,新库默认使用utf8mb4字符集。utf8mb4是utf8的超集,emoji表情以及部分不常见汉字在utf8下会表现为乱码,故需要升级至utf8mb4。默认使用这个字符集的原因是:“标准,万国码,无需转码,无乱码风险”,并不“节省空间”。

  2. 数据表、数据字段必须加入中文注释

  3. 禁止使用外键,如果有外键完整性约束,需要应用程序控制:外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql 的性能,甚至会造成死锁。高并发情况下容易造成数据库性能,大数据高并发业务场景数据库使用以性能优先

  4. 禁止大表使用JOIN查询,禁止大表使用子查询

  5. 只允许使用内网域名,而不是ip连接数据库。不只是数据库,缓存(memcache、redis)的连接,服务(service)的连接都必须使用内网域名,机器迁移/平滑升级/运维管理…太多太多的好处,如果朋友你还是采用ip直连的,赶紧升级到内网域名吧。

  6. 禁止使用小数存储货币,建议使用整数存储,小数容易获取导致钱对不上

  7. 禁止使用负向查询NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,以及%开头的模糊查询,会导致全表扫描。 
    一般来说,WHERE过滤条件不会只带这么一个“负向查询条件”,还会有其他过滤条件,举个例子:查询沈剑已完成订单之外的订单(好拗口): 
    SELECT oid FROM t_order WHERE uid=123 AND status != 1; 
    订单表5000w数据,但uid=123就会迅速的将数据量过滤到很少的级别(uid建立了索引),此时再接上一个负向的查询条件就无所谓了,扫描的行数本身就会很少。 
    但如果要查询所有已完成订单之外的订单: 
    SELECT oid FROM t_order WHERE status != 1; 
    这就挂了,立马CPU100%,status索引会失效,负向查询导致全表扫描。

  8. 禁止使用应用程序配置文件内的帐号手工访问线上数据库

  9. 禁止非DBA对线上数据库进行写操作,修改线上数据需要提交工单,由DBA执行,提交的SQL语句必须经过测试

  10. 分配非DBA以只读帐号,必须通过VPN+跳板机访问授权的从库

  11. 开发、测试、线上环境隔离

  12. 必须使用InnoDB存储引擎:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高

  13. 禁止存储大文件或者大照片:为何要让数据库做它不擅长的事情?大文件和照片存储在文件系统,数据库里存URI多好

  14. 线上环境、开发环境、测试环境数据库内网域名遵循命名规范(自己的命名规范)

  15. 库名、表名、字段名:小写,下划线风格,不超过32个字符,必须见名知意,禁止拼音英文混用

  16. 表名t_xxx,非唯一索引名idx_xxx,唯一索引名uniq_xxx

  17. 单实例表数目必须小于500

  18. 单表列数目必须小于30(这个数目看业务,不过一般不会太多)

  19. 表必须有主键,例如自增主键

  20. 必须把字段定义为NOT NULL并且提供默认值

  21. 禁止使用TEXT、BLOB类型

  22. 必须使用varchar(20)存储手机号

  23. 禁止使用ENUM,可使用TINYINT代替:增加新的ENUM值要做DDL操作;ENUM的内部实际存储就是整数,你以为自己定义的是字符串?

  24. 单表索引建议控制在5个以内

  25. 单索引字段数不允许超过5个

  26. 禁止在更新十分频繁、区分度不高的属性上建立索引

  27. 建立组合索引,必须把区分度高的字段放在前面:能够更加有效的过滤数据

  28. 禁止使用SELECT *,只获取必要的字段,需要显示说明列属性

  29. 禁止使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性:容易在增加或者删除字段后出现程序BUG

  30. 禁止使用属性隐式转换:SELECT uid FROM t_user WHERE phOne=13812345678 会导致全表扫描,而不能命中phone索引

  31. 禁止在WHERE条件的属性上使用函数或者表达式

  32. 应用程序必须捕获SQL异常,并有相应处理

  33. 禁止使用OR条件,必须改为IN查询,in的个数建议控制在200以内:旧版本Mysql的OR查询是不能命中索引的,即使能命中索引,为何要让数据库耗费更多的CPU帮助实施查询优化呢?

  34. 不在数据库做运算:cpu计算务必移至业务层

  35. 控制单表数据量:单表记录控制在1000w

  36. 平衡范式与冗余:为提高效率牺牲范式设计,冗余数据

  37. 拒绝3B:拒绝大sql,大事物,大批量

  38. 字符转化为数字

  39. sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库

  40. 简单的事务:事务时间尽可能短

  41. limit高效分页:limit越大,效率越低

  42. 少用连接join

  43. 使用load data导数据:load data比insert快约20倍;

  44. 打散批量更新

隐式类型转换

所谓隐式转换就是说我们在写SQL语句时,对两个数据的比较、计算等如果数据类型不一致,且没有明确的转换数据类型时,数据库为了计算、比较会对某一个数据的数据类型进行隐式的转换。

当我们某一个查询导致某个列的数据发生类型隐式转换时,索引就不能再用了,所以建议大家在条件设置时,请明确的转换好类型在比较。比如:varchar型的f_qq1_id,转换成浮点型比较时,等于 12345 的情况有无数种如12345a、12345.b等待,MySQL优化器无法确定索引是否更有效,所以选择了其它方案。

注:下方的隐式转换都是我从网上总结的,有错误的欢迎指正

mysql

比较(<、> 、=、>=、<=) 计算(+、- 、* 、/)

  1. 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外:使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
  2. 两个参数类型相同时进行比较
  3. 十六进制的值和非数字做比较时,会被当做二进制串
  4. 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp,比较和计算都符合
  5. 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
  6. 所有其他情况下比较(两个类型不一致),两个参数都会被转换为浮点数再进行比较
  7. 所有数据类型在计算时都会转换成浮点数在计算,就算两个字符串计算也是一样。

注: 
1.当一个字符串和数值型数据进行计算、比较时,如果字符串是以数字开头,比如:'55ab'其会隐式转换为开头的数字, 前面的就是55,但是如果字符串是以字母开头,则统一会转换成0。所以会有下面的查询情况:

select '55abv' + 55  结果为 110
select 'abv55' + 55 结果为 55
select '56abv' > 55 结果为 1
select '55abv' = 55 结果为 1 
select 'abv55' = 55 结果为 0
select '55abv' > 55 结果为 0
//code字段为字符串字段,其有三条数据: GB245 、245GB 、GBSER
select * from test where code = 0 结果匹配为:GB245 、GBSER //因为在比较时,这两个数据都会被隐式的转换为0
select * from test where code = 0 + '245' 结果为 245GB  //因为后面的加法计算已经将后面的数据转换成了浮点数245,与字符串字段比较,其他的会转换成浮点数0,245GB 会转换成浮点数 245 所以匹配成功
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

orcale

1.当比较字符型和数值型的值时,oracle会把字符型的值隐式转换为数值型,这种处理可能发生在条件值上,也可能发生在列上。

  • Oracle发现类型的不匹配之后,如果数据表列是数字类型,而输入值是一个字符串,Oracle会对字符串进行to_number函数处理。这种情况是正向的,不会影响到索引列的使用。

  • 我们看到了不同,如果列是一个字符串类型,输入一个数字类型条件值,就会让Oracle在列上面添加to_number函数。也就是说,会对字符串对象进行处理。此种情况下将不会走索引

2.对于INSERT和UPDATE操作,oracle会把插入值或者更新值隐式转换为字段的数据类型。

3.当比较字符型和日期型的数据时,oracle会把字符型转换为日期型。

4.隐式转换发正在字段列上时将使索引失效

隐式转换的缺点:

  1. 使用显示类型转换会让我们的SQL更加容易被理解,也就是可读性更强,但是隐式类型转换却没有这个优点。

  2. 隐式类型转换往往对性能产生不好的影响,特别是左值的类型被隐式转为了右值的类型。这种方式很可能使我们本来可以使用索引的而没有用上索引,也有可能会导致结 
    果出错。

  3. 隐式类型转换可能依赖于发生转换时的上下文环境,比如1中的to_date(sysdate,fmt),一旦上下文环境改变,很可能我们的程序就不能运行。

  4. 隐式类型转换的算法或规则,以后Oracle可能改变,这是很危险的,意味着旧的代码很可能在新的Oracle版本中运行出现问题(性能、错误等),显示类型转换总是有最高 
    的优先级,所以显示类型转换没有这种版本更替可能带来的问题。

  5. 隐式类型转换是要消耗时间的,当然同等的显式类型转换时间也差不多,最好的方法就是避免类似的转换,在显示类型转换上我们会看到,最好不要将左值进行类型转换,到 
    时候有索引也用不上索引,还要建函数索引,索引储存和管理开销增大。

总结:

Oracle使用数据类型的优先级来决定隐式类型转换,原则是将优先级低的转换为优先级高的(数据类型优先级为:Number>字符类型>日期类型)。隐式转换发生在字段列上时将使索引失效


推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
author-avatar
isonlyk
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有