易截截图软件、单文件、免安装、纯绿色、仅160KB
热门标签: c c# c++ asp asp.net linux php jsp java vb Python Ruby mysql sql access Sqlite sqlserver delphi javascript Oracle ajax wap mssql html css flash flex dreamweaver xml
 最新文章 :

【转】SQL 优化

from: http://www.javaeye.com/topic/498902?page=1 
最近从朋友那看了一个某咨询公司给一家企业做的一个优化项目的总结报告书,其历时两个月,10万费用,4个人。
最终结果是性能和相应提升了30%,总共修改了3行代码和配置,共修改了3个单词,不到20个字母~~~~。
朋友总结了一句话,就是“代码质量越烂的项目,优化起来越容易!”。像上面这个项目,外行会认为做优化的人一定是
超一流的高手,有点石成金之能力。其实不然,朋友说,“我们其实只是改了他们系统里一个明显的漏洞,这个漏洞让整个
数据库50%的时间都在空转,仅此而已”。 
之后他又给我看了这个项目db的statspack、addm、STA、SAA、以及几个session的trace文件,几个性能试图的定时统计
值,几个java的thread dump文件,jvm的统计信息文件,项目的架构...等等,想考考我还有多大的提升空间。我用一天的时
间仔细看了一下,得出的结论是--如果深度优化,这个项目保守估计还有300%的性能提升空间,也就是说按这个硬件的水平,
客户响应时间可以缩短到三分之一。我把这一结果告诉朋友,他说我还是比较保守的,他们估计这个项目的优化空间可以达到
1000%!
说了这许多的� ......

动态sql语句基本语法


SQL code
动态sql语句基本语法
1 :普通SQL语句可以用Exec执行
eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N
2:字段名,表名,数据库名之类作为变量时,必须用动态SQL
eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格
当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名
declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错
declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确
3. 输出参数
declare @ ......

SQL中object_id函数的用法

 int object_id('objectname');
此方法返回数据库对象标识号。
其中,参数objectname 表示要使用的对象,其数据类型为nchar或char(如果为char,系统将其转换为nchar)
返回类型为int,表示该对象在系统中的编号。
比如:
use wf_timesheet
select object_id('usp_check_excess_hours')
返回为197575742。
此方法一般用来判断数据库中本来用没有此对象(procedures,views,functions等),如在新建一个存储过程时我们可以看到这样的语句:
IF NOT EXISTS (SELECT * from sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_send_email]') AND type in (N'P', N'PC'))
事先判断数据库中是否已经存在存储过程usp_send_email, ......

修改SQL数据库的名称


其实在修改数据库名称之前,如果有用户连接到数据库的话会造成数据库重命名失败,可以先执行
select spid
from master.dbo.sysprocesses
where dbid=db_id('OldDbName')
结果集中显示的是当前连接到数据库OldDbName的连接
比如结果是
79
81
当然,实际值应该不是这两个
然后执行
kill 79
kill 81
关闭已建立的连接,之后再执行
EXEC sp_dboption 'OldDbName', 'Single User', 'TRUE'
EXEC sp_renamedb 'OldDbName', 'NewDbName'
EXEC sp_dboption 'NewDbName', 'Single User', 'FALSE'
上述语句最好都在master数据库中执行。 ......

ACCESS数据库到SQL数据库

 从Access数据库导入到SQL
方法一:
在MSsql中要简历ODBC..方法比较笨点..
方法二:
直接从Access升迁到MSsql..
因为Access数据库有设置密码..还真不好搞..搞了好几次都失败了..
利用方法二..一次成功..
用数据库升迁...简单...
建议使用第二种方法导入ACCESS数据库到MSSQL数据库中..省事!!! ......

ACCESS数据库到SQL数据库

 从Access数据库导入到SQL
方法一:
在MSsql中要简历ODBC..方法比较笨点..
方法二:
直接从Access升迁到MSsql..
因为Access数据库有设置密码..还真不好搞..搞了好几次都失败了..
利用方法二..一次成功..
用数据库升迁...简单...
建议使用第二种方法导入ACCESS数据库到MSSQL数据库中..省事!!! ......

SQL优化过程中常见Oracle HINT的用法

 在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法:
1. /*+ALL_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.
例如:
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN from BSEMPMS WHERE EMP_NO='SCOTT';
2. /*+FIRST_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.
例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN from BSEMPMS WHERE EMP_NO='SCOTT';
3. /*+CHOOSE*/
表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;
表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;
例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN from BSEMPMS WHERE EMP_NO='SCOTT';
4. /*+RULE*/
表明对语句块选择基于规则的优化方法.
例如:
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN from BSEMPMS WHERE EMP_NO='SCOTT';
5. /*+FULL(TABLE)*/
表明对表选择全局扫描的方法.
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM from BSEMPMS A WHERE EMP_NO='SCOTT';
6. /*+ROWID(TAB ......

SQL优化过程中常见Oracle HINT的用法

 在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法:
1. /*+ALL_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.
例如:
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN from BSEMPMS WHERE EMP_NO='SCOTT';
2. /*+FIRST_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.
例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN from BSEMPMS WHERE EMP_NO='SCOTT';
3. /*+CHOOSE*/
表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;
表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;
例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN from BSEMPMS WHERE EMP_NO='SCOTT';
4. /*+RULE*/
表明对语句块选择基于规则的优化方法.
例如:
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN from BSEMPMS WHERE EMP_NO='SCOTT';
5. /*+FULL(TABLE)*/
表明对表选择全局扫描的方法.
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM from BSEMPMS A WHERE EMP_NO='SCOTT';
6. /*+ROWID(TAB ......
总记录数:40319; 总页数:6720; 每页6 条; 首页 上一页 [5559] [5560] [5561] [5562] 5563 [5564] [5565] [5566] [5567] [5568]  下一页 尾页
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号