- 浏览: 557758 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (340)
- Spring (4)
- Hibernate (2)
- Linux (34)
- Oracle (145)
- Eclipse (1)
- UML (1)
- HTML&&JAVASCRIPT (11)
- JAVA (33)
- 设计模式 (1)
- 版本控制 (1)
- wrap框架 (3)
- IBATIS (5)
- Ruby (1)
- DWR (1)
- MINA (11)
- JBPM (2)
- 缓存技术 (4)
- 网络 (3)
- 应用服务器 (1)
- GWT (5)
- 杂谈 (2)
- ICE (4)
- XML (2)
- ArcGis (2)
- Flex (8)
- junit单元测试 (1)
- SNMP (1)
- 存储 (1)
- office (1)
- MongoDB (0)
- Greenplum (3)
- 管理点滴 (1)
- C++ (6)
- 网络入门 (3)
- Tomcat (7)
- JMX (0)
- webservice (1)
- Oracle的10046事件 (1)
- Library cache内部机制详解 (1)
- expdp通过dblink来导入 (1)
最新评论
-
yuanliangding:
有没有关于mock的更多知识。
基于mock对象和JUnit框架简化Spring Web组件单元测试 -
saup007:
ssh端口不是22,怎么搞呢?
Greenplum 学习笔记 -
springmvc-freemarker:
java开源项目源码实例下载
Apache上全部JAVA开源项目简介 -
bobbell:
哇塞,你真厉害,整理的非常全面。我是一个java barcod ...
Greenplum 学习笔记 -
wsj55133245513324:
这不是bug,你将日志级别从debug提升到INFO 就好了 ...
Spring,smppapi,apache mina, ssl快速实现安全的smpp(5)
每个数据库平台上的SQL开发人员都是在困难中求得生存,我们总是一次又一次犯同样的错误,这是因为数据库领域还相对不成熟,是的,每个数据库厂商都在做着各种不同的努力,但作为开发人员仍然要克服各种问题,无论是在SQL Server,Oracle,DB2,Sybase,MySQL数据库,还是其它关系数据库平台上编写SQL代码,并发性、资源管理、空间管理和SQL运行速度总是困扰着开发人员。 遗憾的是,其中部分问题的解决没有灵丹妙药,也几乎没有最佳实践。通常,开发人员有自己喜欢的SQL书写习惯,一般不愿意去研究其它可行方案,当然这可能是因为缺少培训的原因。我见得最多的就是在测试环境中SQL查询运行良好,但尚未在生产系统上进行试运行,就草草收场了,至于后来发现有问题,再被动式修改,因此最终用户就痛苦了。 我不期望开发人员成为DBA,但我们编写代码时必须考虑生产时的问题,如果不在开发初期这么做,DBA发现后只能迫使我们返工。 我们通常说数据库调试是一门技术,更是一门艺术,这是因为很少有现成的规则可以适应一切问题的解决,你在一个系统上解决的问题在另一个系统上可能就不是问题了,反之亦然。涉及到查询调整时,没有一个答案是完全正确的,但这并不意味着你应该放弃。 适当遵循一些原则可以让工作变得更加轻松,本文就列举7个可以灵活运用的原则,它们可以帮助你提高SQL查询速度,当然这些技巧你可以咨询DBA获得更多的信息。 1、用case代替update 要更新一条记录,我们立即会想到update,这个问题非常常见,许多开发人员经常忽视这个原则,因为使用update看起来非常自然,非常合乎逻辑。 假设你从Customer表中提取记录,你想将超过10万美元的订单标记为“Preferred”,因此你会想到使用一条update语句将CustomerRank列更新为“Preferred”,问题是update语句是有日志的,这就意味着每条记录它会写两次,解决这个问题的办法就是在SQL查询中内嵌case语句,在向表写入“Preferred”标志前,它会用订单金额条件对每一行进行检查,满足条件的才会更新,性能的提升是惊人的。 2、不要盲目地重用代码 这个问题也非常常见,在工作中直接用别人写好的代码是一件痛快的事情,你知道这些代码可以查询出你需要的数据,但问题是往往有些数据不是你需要的,但我们常常不愿意做一下修改,因此返回的数据集往往是一个超集,很可能多用一个外连接或是一个where子句就可以解决问题,因此在复用代码时最好检查一下,如有必要略做适应性修改。 3、只提取你需要的列 这个问题和2有点类似,但这次是指定具体的列。也许我们在使用select * 时感觉很畅快,多省事呀!如果要将每个列名都写出来,太麻烦了,这是很多人的想法,但这种想法是错误的,因为这样做会取出多余的数据列,我无数次看到犯这种错误的代码,曾经有一位开发人员对一张有120列,上百万行数据的表使用select * 查询,但他只会用到其中的三五列,这是对资源的极大浪费,我们建议拒绝书写select * ,你要什么就查询什么,多余的返回结果对你没用,虽然不影响你要实现的功能,但对数据库性能却有极大的影响。 4、尽可能只查询一次大表 这也是我看到很多人犯的错误,例如,某存储过程从一张上百万条记录的大表中取数据,开发人员想提取居住在加利福利亚且收入高于4万美元的客户信息,因此它先将居住在加利福利亚的客户取出放在一张临时表中,然后再查询收入高于4万美元的客户,将查询结果放入另一张临时表中,最后,他连接这两张临时表查询出最终的结果。 可能有人认为我是在开玩笑吧?但事实是确实有人这么做,这应该在一个查询中就能完成,却查询了两次大表。 有种稍微不同的情况是,当一个过程中的多个步骤需要大表的子集时,每一步可能都必须查询一次大表。避免多次查询的办法是持久化第一次查询的子集,然后将后面的步骤指向该持久化子集。 5、使用临时表 这个问题解决起来可能稍微有点麻烦,但其效果比较明显,其实在很多时候你都可以使用临时表,通过临时表可以有效地减少对大表的操作,如果你必须连接一个表到大表,并且在大表上有条件,这时就可以将大表中需要的数据输出到临时表中,然后再用该临时表进行连接,这样查询速度会有明显改进。如果你的存储过程中有多个查询需要需要连接到相同的表时,也可以使用临时表。 6、预存数据 这一条是我最喜欢的,因为它是一项很老的技术,常常被人们忽视,如果你有一个报表或存储过程需要连接大表,提前提取大表中的数据,持久化存储到另一张表中,报表就可以使用预存的数据集,从而提高整体执行效率。 并不是所有时候你都有机会利用该技术,但一旦能利用上,你会发现它是节省服务器资源很有效的办法。 但遗憾的是,很多开发人员都在尽力回避这种技术,实际上只需要创建一个视图就可以把问题解决了,但这种方法的问题是每个需要它的报表运行时都会执行一次,但对于同一个报表,假设10分钟前运行了一次,现在有人要再运行该报表,那么对大表的连接操作就可以避免掉了。我建议对那些经常被查询的表使用该技术将数据预存起来,可以节省大量的服务器资源。 7、分批删除和更新 这也是一个容易被忽视的技巧,对一个大表做数据删除或更新操作,如果操作不当可能是一场噩梦,问题是这两种操作都是单一的事务,如果你需要杀死它们,或它们在执行时系统遇到问题,必须全部回滚整个事务,这个时间可能非常长,这就是为什么我们在删除数十万条记录时,如果试图中途杀死进程几乎没用的原因,这些操作也会影响到其它事务,搞不好会造成死循环,因此应慎用。 解决这个问题的办法就是分批少量删除或更新,首先,无论什么原因需要结束事务,只需要回滚少量的行,此外,小批量提交数据写入磁盘,对I/O的要求也更低,并发性可以大大提高。 另外要提醒的是,执行删除和更新操作应尽量选择非高峰时段。 总结 遵循这些方法总是能收到效果,但在实践中,应该评估选用一种或几种最佳方案,大家一定要记住,没有那种办法是万能的。另外,这些技巧适用于所有数据库品种,因此你必须全部掌握!
发表评论
-
expdp通过dblink来导入
2011-12-14 15:01 1789create.sql: spo create.log rem ... -
Library cache内部机制详解
2011-12-14 14:55 891Library cache内部机制详解 http://www ... -
Oracle的10046事件
2011-12-14 14:53 2098Oracle的10046事件,可以跟踪应用程序所执行的SQL语 ... -
REDO LOG MEMBER STATUS 和 REDO LOG GROUP STATUS
2011-12-14 14:51 928V$LOG 中列出的是REDO LOG GROUP STA ... -
oracle的exp/imp使用方法学习(转)
2011-08-30 08:54 964exp/imp两个命令可以说是oracle中最常用的命令了 ... -
oracle几个awr报告
2011-08-09 14:25 900工作中,碰到的数据库慢的几个awr报告 -
Oracle Profile 使用详解
2011-06-21 14:41 972一、目的: Oracle系统中的profile可以用来对 ... -
ORA-27013
2011-04-13 14:25 1516很新的一个bug,看下你的 memory_target是不是& ... -
ACLE表连接方式分析及常见用法
2011-03-23 09:14 1115摘要: 针对在数据仓库 ... -
ORACLE 外部表应用
2011-03-09 14:58 1068SQL> create or replace direc ... -
How to convert a 32-bit database to 64-bit database on Linux
2011-02-18 14:09 1216How to convert a 32-bit databas ... -
expdp impdp 数据库导入导出命令详解
2011-02-16 09:10 1956一、创建逻辑目录,该命令不会在操作系统创建真正的目录,最 ... -
Oracle手工解/锁表
2011-01-25 14:15 2507手工锁表:lock table tbl_t1 in row ... -
oracle动态性能视图
2011-01-22 10:47 862Oracle动态性能视图个人整理 -
RBO规则介绍
2011-01-17 16:45 1080•无条件使用索引•使用内置的优先级别决定访问路径•比较难以 ... -
关于排序、sort_area_size、临时表空间
2011-01-13 15:30 1120简单陈述一下:针对每 ... -
创建索引ORACLE 需要做的工作
2011-01-13 14:53 1324一. 先来看一下创建索引要做哪些操作:1. 把inde ... -
表之间的连接
2011-01-13 10:42 798Join是一种试图将两个表结合在一起的谓词,一次只能连接2 ... -
重建索引的条件
2011-01-12 16:43 955如果索引存在碎片,那每个索引数据块上的索引数据就更少,会导致我 ... -
TKPROF使用学习
2011-01-10 17:38 725Tkprof工具可用来格式化sql trace产生的文件, ...
相关推荐
### DBA推荐的7大法宝提高SQL查询性能 ...总之,通过上述七个法宝的应用,可以显著提高SQL查询性能。无论是从数据库设计阶段就开始规划,还是在日常维护过程中不断优化,都能有效提升数据库系统的整体表现。
5. **SQL识别**:识别并优化低效的SQL语句,减少不必要的计算和IO操作,提升查询性能。 6. **表定义优化**:合理设计表结构,包括分区、索引等,以适应业务需求,加快数据访问速度。 通过掌握这些"法宝",DBA能够...
### SSIS性能调整详解 #### 引言 随着SQL Server 2005引入SSIS(SQL Server Integration Services),数据库管理领域...在面对日益增长的数据量和复杂的数据处理需求时,持续优化SSIS的性能将成为DBA们的制胜法宝。
编写高效的SQL语句是提高数据库检索效率的另一个重点。SQL语句的编写质量直接影响到数据库的性能。良好的SQL语句设计能够减少数据库分析和处理时间,优化索引的使用可以显著降低数据检索的响应时间。Oracle数据库...
- **子查询**:在查询语句中嵌套另一个查询语句,作为条件的一部分。 4. **规范化理论**: - **第二范式 (2NF)**:消除非主属性对候选键的部分依赖。 - **第三范式 (3NF)**:进一步消除传递依赖,达到更高级别的...
`array()` 用于创建数组,`count()` 计算元素个数,`foreach` 循环遍历数组。 7. **文件操作** PHP可以读写文件,如 `fopen` 打开文件,`fwrite` 写入文件,`fclose` 关闭文件。`file_get_contents` 和 `file_put_...
在数据库领域,这可能涉及查询性能低下、数据冗余、索引不当等问题。通过监控、日志分析等手段,我们可以定位问题,进行针对性的优化。 2. **需求与设计**:在第二次买鱼时,小余开始思考并规划更有效的方法。在...
对于数据库操作,如创建表、填充数据、执行查询等,开发者通常需要编写SQL脚本。代码生成器可以分析数据库模型,自动生成相应的创建表、插入数据、更新记录等脚本,使得数据库的维护变得更加便捷。 此外,工具还...
数据源路由是决定哪个数据源应该被用来执行SQL查询的关键组件。Spring Boot中可以通过自定义`AbstractRoutingDataSource`实现这个功能。`DataSouceRouter`类会根据某种规则(如事务上下文、请求参数等)动态选择...
它旨在提高开发者的生产力,同时提供高效的执行性能。在golang.org这个网站上,我们可以找到Go语言的官方文档、标准库、工具链以及社区资源,是学习Go语言的重要入口。 首先,我们来了解一下Go语言的核心特性。Go...
- **探索方向**:介绍了阿里巴巴在数据库智能优化方面的探索方向,包括SQL优化器、自动索引管理、性能监控与诊断等。 - **实践案例**:提供了具体的应用案例,如通过机器学习技术优化查询执行计划,利用动态规划...