ǰλã >> SQL >> SQL调优(
  ϸ

SQL调优(

ȶȣ4538   ʱ䣺2016-05-05 11:31:20.0
SQL调优(?
?、问题的提出

?在应用系统开发初期,由于?发数?数据比较少,对于查?SQL?,?杂?图的的编写等体会不出SQL?各?写法的?能优劣,但??果将应用系统提交实际应用后,随着数据库中数据的?加,系统的响应?度就成为目前系统需要解决的?主?的问题之?。系统优化中??重?的方面就是SQL?的优化??于海量数?劣质SQL?和优质SQL?之间的?度??达到上百倍,??对于??统不?单地能实现其功能就可,?是要写出高质量的SQL?,提高系统的?性??

??在?数情况下,Oracle使用索引来更?遍历?优化器主要根?义的索引来提高?能。但?如果在SQL?的where子句?的SQL代码不合理,就会造成优化器删去索引?使用全表扫描,??这?SQL?就是?谓的劣质SQL?。在编写SQL?时我?清?优化器根?种原则来删除索引,这有助于写出高性能的SQL??

??二?SQL?编写注意??

??下面就某些SQL?的where子句编写?要注意的??作?细介绍?在这些where子句?即使某些列存在索引,但是由于编写了劣质的SQL,系统在运??QL?时也不能使用该索引,而同样使用全表扫描,这就造成了响应?度的极大降低??

??1. IS NULL ?IS NOT NULL

??不能用null作索引,任何包含null值的列都将不会?包含在索引中。即使索引有多列这样的情况下,只要这些列??列含有null,?列就会从索引?除?也就是说?果某列存在空值,即使对?列建索引也不会提高?能?

??任何在where子句?用is null或is not null的?句优化器?允?使用索引的??

??2. 联接?

??对于有联接的列,即使?后的联接值为??态?,优化器是不会使用索引的?我?起来看一?子,假定有一?工表(employee),?于一?工的姓和名分成两列存?FIRST_NAME和LAST_NAME),现在?查???比尔.克林?Bill Cliton)的职工??

??下面??用联接查询的SQL??

    select * from employss where first_name||''||last_name ='Beill Cliton';

    上面这条?完全?查?出是否有Bill Cliton这个员工,但?里需要注意,系统优化器?基于last_name创建的索引没有使用??

??当采用下面这种SQL?的编写,Oracle系统就可以采用基于last_name创建的索引??

    *** where first_name ='Beill' and last_name ='Cliton';

   . 带?配?%)的like?

??同样以上面的例子来看这?情况。目前的?求是这样的,要求在职工表?询名字中包含cliton的人。可以采用?下的查?SQL?:

    select * from employee where last_name like '%cliton%';

    这里由于通配?%)在搜寻词首出现,??racle系统不使用last_name的索引?在很?情况下可能无法避免这种情况,但是?定?心中有底,?配符?此使用会降低查?速度。然而当通配符出现在字?串其他位?,优化器就能利用索引。在下面的查?索引得到了使?

    select * from employee where last_name like 'c%';

4. Order by?

??ORDER BY?决定了Oracle如何将返回的查?结果排序。Order by?对?排序的列没有?么特?限制,也?将函数加入列?象联接或者附加等)。任何在Order by?的非索引项或者有计算表达式都将降低查询?度?

??仔细??rder by?以找出非索引项或者表达式,它?降低性能。解决这?题的办法就是重写order by?以使用索引,也可以为?使用的列建立另???引,同时应绝对避免在order by子句?用表达式?

5. NOT

??我们在查询时经常在where子句使用?些?辑表达式,如大于?小于?等于以及不等于等等,也?使用and(?、or(?以及not(?。NOT?来?任何逻辑运算符号取反。下面是?个NOT子句的例?

... where not (status ='VALID')

如果要使用NOT,则应在取反的短?面加上括号,并在??前面加上NOT运算符?NOT运算符包?另????辑运算符中,这就是不等?<>)运算符?换句话说,即使不在查?where子句?式地加入NOT词,NOT仍在运算符中,?下例:

... where status <>'INVALID';

对这???改写为不使用NOT:

select * from employee where salary<3000 or salary>3000;

虽然这两种查询的结果?样,但是?种查询方案会比??种查询方案更?。?二?查?允?Oracle对salary列使用索引,而??种查询则不能使用索引?


虽然这两种查询的结果?样,但是?种查询方案会比??种查询方案更?。?二?查?允?Oracle对salary列使用索引,而??种查询则不能使用索引?


===============================================================================================

我们要做到不但会写SQL,还?做到写出性能优良的SQL,以下为笔者?习?摘录?并汇?部分资料与大?分享?
??nbsp;     选择?有效率的表名顺序(?基于规则的优化器???
ORACLE 的解析器按照从右到左的顺序?理FROM子句?表名,FROM子句?在最后的?基??driving table)将??先?理,在FROM子句????的情况下,你必须?择记录条数?少的表作为基?表??果有3?上的表连接查? 那就?要?择交叉?intersection table)作为基?? 交叉表是指那??其他表所引用的表.
??nbsp;     WHERE子句?连接顺序.:
ORACLE采用?而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些?过滤掉最大数量?录的条件必须写在WHERE子句的末?
??nbsp;     SELECT子句?免使??* ‘:
ORACLE在解析的过程? 会将'*' 依??成所有的列名, 这个工作??过查?数据字典完成? 这意味着将?费更?的时?
??nbsp;     减少访问数据库的次数?
ORACLE在内部执行了许?工作: 解析SQL?, 估算索引的利用率, 绑定变量 , 读数?等;
??nbsp;     在SQL*Plus , SQL*Forms和Pro*C?新?置ARRAYSIZE参数, ?增加每?数据库???索数? ,建?值为200
??nbsp;     使用DECODE函数来减少?理时间:
使用DECODE函数?避免重??相同记录或重复连接相同的?
??nbsp;     整合??无关联的数据库??
如果你有几个?单的数据库查询??你可以把它们整合到一??(即使它们之间没有关系)
??nbsp;     删除重?记录?
?高效的删除重复?录方?( 因为使用了ROWID)例子?
DELETE  FROM  EMP E  WHERE  E.ROWID > (SELECT MIN(X.ROWID)
FROM  EMP X  WHERE  X.EMP_NO = E.EMP_NO);
??nbsp;     用TRUNCATE替代DELETE?
当删除表?记录?在?常情况? 回滚?rollback segments ) 用来存放??复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢?到删除之前的状??准确地??复到执?删除命令之前的状? 而当运用TRUNCATE? 回滚段不再存放任何可?复的信息.当命令运行后,数据不能??因?很少的资源?调用,执?时间也会很短. (译?按: TRUNCATE?删除全表适用,TRUNCATE是DDL不是DML)
?0?尽量多使用COMMIT?
??有可?在程序中尽量多使用COMMIT, 这样程序的?能得到提高,?求也会因为COMMIT?释放的资源?减?
COMMIT?释放的资?
a. 回滚段上用于恢?数据的信?
b. ?序?句获得的?
c. redo log buffer ?空间
d. ORACLE为?理上?种资源中的内部花?
?1?用Where子句替换HAVING子句?
避免使用HAVING子句, HAVING ?在?索出?有?录之后才对结果集进?过滤. 这个处理?要排?总?等操? 如果能?过WHERE子句限制记录的数?那就能减少这方面的开?. (非oracle?on、where、having这三??加条件的子句?on?先执行,where次之,having?后,因为on?把不 符合条件的?录过滤后才进行统计,它就?减少?运算要?理的数据,按理?应?速度??,where也应该比having?的,因为它过滤数? 才进行sum,在两个表联接时才用on的,?以在??的时候,就剩下where跟having比较了?在这单表查询统计的情况下,如果要过滤的条件没有涉及到?计算字?,那它们的结果是?样的,只是where?使用rushmore??而having就不能,在?度上后者?慢?果?涉及到?算的?段,就表示在没?算之前,这个字?的?是不确定的,根?篇写的工作流程,where的作用时间是在?算之前就完成的,而having就是在?算后才起?用的,所以在这?情况下,两?的结果会不同?在多表联接查?时,on比where更早起作用?系统?先根??之间的联接条件,把??合成??时表 后,再由where进?过滤,然后再计算,?算完后再由having进?过滤。由此可见,要想过滤条件起到正确的作?首先要明白这?件应该在?么时候起作用,然后再决定放在那里
?2?减少对表的查?
在含有子查?的SQL??要特?意减少?表的查?.例子?
    SELECT  TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT
TAB_NAME,DB_VER FROM  TAB_COLUMNS  WHERE  VERSION = 604)
?3?通过内部函数提高SQL效率.?
复杂的SQL??牺牲了执行效? 能?掌握上面的运用函数解决问题的方法在实际工作中?常有意义?
?4?使用表的?(Alias)?
当在SQL??接??? 请使用表的别名并把别名前?于每个Column?这样??就可以减少解析的时间并减少那些由Column歧义引起的?法错?
?5?用EXISTS替代IN、用NOT EXISTS替代NOT IN?
在?多基于基?表的查??为了满足??????要?另一?进?联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查??NOT IN子句将执行一?部的排序和合? 无?在哪种情况下,NOT IN都是?低效?(因为它?子查?的表执?了一?表遍?. 为了避免使用NOT IN ,我们?把它改写成?连接(Outer Joins)或NOT EXISTS.
例子?
(高效)SELECT * FROM  EMP (基??  WHERE  EMPNO > 0  AND  EXISTS (SELECT ‘X'  FROM DEPT  WHERE  DEPT.DEPTNO = EMP.DEPTNO  AND  LOC = ‘MELB')
(低效)SELECT  * FROM  EMP (基??  WHERE  EMPNO > 0  AND  DEPTNO IN(SELECT DEPTNO  FROM  DEPT  WHERE  LOC = ‘MELB')
?6?识别'低效执?'的SQL??
虽然?各?关于SQL优化的图形化工具层出不穷,但是写出?的SQL工具来解决问题?终是??好的方法?
SELECT  EXECUTIONS , DISK_READS, BUFFER_GETS,
ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
SQL_TEXT
FROM  V$SQLAREA
WHERE  EXECUTIONS>0
AND  BUFFER_GETS > 0
AND  (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
ORDER BY  4 DESC;

?7?用索引提高效率:
索引?的一??念部?用来提高?索数?效率,ORACLE使用了一??杂的??-tree结构. 通常,通过索引查?数据比全表扫描?? 当ORACLE找出执?查?和Update?的最佳路径时, ORACLE优化器将使用索引. 同样在联结??时使用索引也?提高效率. 另一?用索引的好??它提供了主键(primary key)的唯?性验?。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的? 通常, 在大型表?用索引特?? 当然,你也会发? 在扫描小表时,使用索引同样能提高效? 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引?要空间来存储,也需要定期维? 每当有?录在表中增减或索引列?改时, 索引?也会?? 这意味着每条记录的INSERT , DELETE , UPDATE将为此?付出4 , 5 次的磁盘I/O . 因为索引?要?外的存储空间和??那些不必要的索引反?会使查询反应时间变?。定期的重构索引?必???
ALTER  INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
18?用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);
?9?sql?用大写的;因为oracle总是先解析sql?,把小写的字母转换成大写的再执?
?0?在java代码?量少用连接?“+”连接字符串?
?1?避免在索引列上使用NOT 通常,??
我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影? 当ORACLE”遇到?NOT,他就会停?用索引转而执行全表扫?
?2?避免在索引列上使用?算.
WHERE子句?如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
举例:
低效?
SELECT ?FROM  DEPT  WHERE SAL * 12 > 25000;
高效:
SELECT ?FROM DEPT WHERE SAL > 25000/12;
?3??gt;=替代>
高效:
SELECT * FROM  EMP  WHERE  DEPTNO >=4
低效:
SELECT * FROM EMP WHERE DEPTNO >3
两?的区别在于, 前?DBMS将直接跳到??个DEPT等于4的?录?后者将首先定位到DEPTNO=3的?录并且向前扫描到?个DEPT大于3的??
?4?用UNION替换OR (适用于索引列)
通常情况? 用UNION替换WHERE子句?OR将会起到较好的效? 对索引列使用OR将?成全表?. 注意, 以上规则?对??引列有效. 如果有column没有?? 查?效率?会因为你没有选择OR而降? 在下面的例子? LOC_ID 和REGION上都建有索引.
高效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = “MELBOURNE?
低效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = “MELBOURNE?
如果你坚持?用OR, 那就?要返回?录最少的索引列写在最前面.
?5?用IN来替?R 
这是?条简单易记的规则,但?际的执?效果还须?验,在ORACLE8i下,两?的执??似乎?同的.??
低效:
SELECT? FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30
高效
SELECT?FROM LOCATION WHERE LOC_IN  IN (10,20,30);
?6?避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何?为空的列,ORACLE将无法使用?索引.?于单列索引,如果列包?值,索引?不存在?记录. 对于复合索引,?果每?都为空,索引?样不存在此???如果至少有一?不为空,则?录存在于索引?举例: 如果?性索引建立在表的A列和B列上, 并且表中存在?条?录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然??果所有的索引列都为空,ORACLE将?为整?值为空?空不等于空. 因?你可以插?000 条具有相同键值的记录,当然它们都是? 因为空?不存在于索引列???HERE子句??索引列进行空值比较将使ORACLE停用该索?
低效: (索引失效)
SELECT ?FROM  DEPARTMENT  WHERE  DEPT_CODE IS NOT NULL;
高效: (索引有效)
SELECT ?FROM  DEPARTMENT  WHERE  DEPT_CODE >=0;
?7?总是使用索引的????
如果索引?立在多个列上, ?在它的???(leading column)被where子句引用?优化器才会?择使用该索? 这也?条简单?重要的规则,当仅引用索引的???优化器使用了全表?而忽略了索引
28?用UNION-ALL 替换UNION ( 如果有可能的??
当SQL ??要UNION两个查?结果集合?这两?果集合会?NION-ALL的方式?合并, 然后在输出最终结果前进?排序. 如果用UNION ALL替代UNION, 这样排序就不?要了. 效率就会因?得到提高. ?要注意的?UNION ALL 将重复输出两?果集合中相同记录. 因?各位还是要从业务?求分析使用UNION ALL的可行?? UNION 将?结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这块内存的优化也?当重要的. 下面的SQL?用来查?排序的消耗量
低效?
SELECT  ACCT_NUM, BALANCE_AMT
FROM  DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
UNION
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
高效:
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
UNION ALL
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
?9?用WHERE替代ORDER BY?
ORDER BY 子句?两?严格的条件下使用索引.
ORDER BY?有的列必须包?相同的索引中并保持在索引?排列顺序.
ORDER BY?有的列必须定义为非空.
WHERE子句使用的索引和ORDER BY子句?使用的索引不能并?
例?:
表DEPT包含以下?
DEPT_CODE PK NOT NULL
DEPT_DESC NOT NULL
DEPT_TYPE NULL
低效: (索引不?使用)
SELECT DEPT_CODE FROM  DEPT  ORDER BY  DEPT_TYPE
高效: (使用索引)
SELECT DEPT_CODE  FROM  DEPT  WHERE  DEPT_TYPE > 0
?0?避免改变索引列的类型.:
当比较不同数?型的数据? ORACLE?对列进??单的类型?.
假? EMPNO??值类型的索引?
SELECT ?nbsp; FROM EMP  WHERE  EMPNO = ?23'
实际?经过ORACLE类型?, ???
SELECT ?nbsp; FROM EMP  WHERE  EMPNO = TO_NUMBER(?23')
幸运的是,类型?没有发生在索引列?索引的用途没有?改变.
现在,假?EMP_TYPE??符类型的索引?
SELECT ?nbsp; FROM EMP  WHERE EMP_TYPE = 123
这个?被ORACLE??
SELECT ?nbsp; FROM EMP  WHERETO_NUMBER(EMP_TYPE)=123
因为内部发生的类型转? 这个索引将不会?用到! 为了避免ORACLE对你的SQL进?隐式的类型转? ?好把类型?用显式表现出? 注意当字符和数?比较时, ORACLE会优先转换数值类型到字?类型
?1??要当心的WHERE子句:
某些SELECT ??WHERE子句不使用索? 这里有一些例?
在下面的例子? (1)?=' 将不使用索引. 记住, 索引?告诉你什么存在于表中, 而不能告诉你?么不存在于表? (2) ?¦ ¦'?符连接函? 就象其他函数那样, 停用了索? (3) ?'?学函? 就象其他数?函数那样, 停用了索? (4)相同的索引列不能互相比较,这将会启用全表扫?
?2?a. 如果?索数?超过30%的表??录数.使用索引将没有显著的效率提高.
b. 在特定情况下, 使用索引也?会比全表?? 但这???量级上的区别. 而?常情况?使用索引比全表扫描?块几倍乃至几千??
?3?避免使用耗费资源的操?
带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL?会启动SQL引擎
执?耗费资源的排?SORT)功能. DISTINCT?要一次排序操? 而其他的至少?要执行两次排? 通常, 带有UNION, MINUS , INTERSECT的SQL?都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是?考虑? 毕竟它们的可读?很?
?4?优化GROUP BY:
提高GROUP BY ?的效? ?通过将不?要的记录在GROUP BY 之前过滤?下面两个查?返回相同结果但?二个明显就快了??
低效:
SELECT JOB , AVG(SAL)
FROM EMP
GROUP by JOB
HAVING JOB = ‘PRESIDENT'
OR JOB = ‘MANAGER'
高效:
SELECT JOB , AVG(SAL)
FROM EMP
WHERE JOB = ‘PRESIDENT'
OR JOB = ‘MANAGER'
GROUP by JOB

====================================
====================================
如果你?在负责一?于SQL Server的项?或?你刚刚接触SQL Server,你都有?要面临一些数?性能的问题,这篇文章会为你提供一些有用的指?(其?多数也可以用于其它的DBMS)??
在这里,我不打算介绍使用SQL Server的窍?也不能提供一?治百病的方?,我?做的??结?些经?---关于如何形成??的?计?这些经验来?过去几年?受的教?,一直来,我看到许?同样的?计错???次又?次的重??
?、了解你用的工具
不?轻?这一点,这是我在这篇文章??述的?关键的一条?也许你也看到有很?的SQL Server程序员没有掌握全部的T-SQL命令和SQL Server提供的那些有用的工具?
“什么?我????的时间来学习那些我永远也不会用到的SQL命令????,你也许会这样说??的,你不?要这样做。但?应?用一??览所有的 T-SQL命令。在这里,你的任务是了解,将来,当你设???询时,你会?起来:??了,这里有一?令可以完全实现我?要的功能”,于是,到MSDN 查看这个命令的确切?法??
二?不要使用游?
让我再重复一遍:不?使用游标。?果你想破坏整?统的性能的话,它??是你最有效的?选办法?大多数的初学?都使用游标,?没有意识到它们对?能造成的影响?它?用内存,还用它们那些不可思?的方式锁定表,另外,它们?直就像蜗牛??最糟糕的是,它?以使你的DBA?能做的一切?能优化等于没做。不 知你?知道每执行一?ETCH就等于执行一?ELECT命令?这意味?如果你的游标?0000条?录,它将执?10000?ELECT!?果你 使用?组SELECT、UPDATE或?DELETE来完成相应的工作,那将有效率的??
初?者一??为使用游标是?种比较熟悉和舒?的编程方式,可很不幸,这会导致糟糕的?能。显然,SQL的?体??要实现什么,而不??样实现?
我曾经用T-SQL重写了一?于游标的存储过程,那??100,000条?录,原来的存储过程用?0分钟才执行完毕,而新的存储过程只用了10秒钟。在这里,我想你应??看到??称职的程序员究竟在干了什么!!!
我们?写一?程序来取得和处理数据并且更新数据库,这样做有时会更有效??住:对于?,T-SQL无能为力?
我再重新提醒?下:使用游标没有好?。除了DBA的工作?,我从来没有看到过使用游标可以有效的完成任何工作?
三??范化你的数据?
为什么不规范化数??大概有两个借口:出于?能的?虑和纯粹因为懒惰?至于?二点,你迟早得为此付出代价??关于?能的问题,你不?要优化根?不慢的东西?我经常看到?些程序员“反规范化?数?,他?理由??原来的设??了?,?果却常常???系统更慢了?DBMS??计用来?理?范数? 的,因?,?住:按照规范化的要求设?数据库??
四?不要使用SELECT *
这点不太容易做到,我?解了,因为我?就经常这样干。可?如果在SELECT?定你??要的列,那将会带来以下的好??
1 减少内存耗费和网络的带?
2 你可以得到更安全的??
3 给查?化器机会从索引?取所有需要的?
五?了解你将?对数?行的操作
为你的数?创建???索引,那?功德?件?可要做到这?点简直就?门艺??每当你为一?添加??引,SELECT会更?,可INSERT 和DELETE却大大的变慢了,因为创建了维护索引需要?多?外的工作。显然,这里??的关?:你要?这张表进行什么样的操作?这?题不?把握,特?涉及DELETE和UPDATE时,因为这些?经常在WHERE部分包含SELECT命令?
??不要给“?别”列创建索引
首先,我?须了解索引是如何加??表的访问的?你?将索引理解为基于?定的标准上?表进行划分的?种方式??果你给类似于“?别”这样的列创建了??索引,你仅仅?表划分为两部分:男和女?你在?理一?1,000,000条?录的?这样的划分有?么意义?记住:维护索引是比较费时的?当你?计索 引时,?遵循这样的?则:根据列可能包?同内容的数目从?到少排列,比如:姓名+省份+性别?
七?使用事?
请使用事务,特别?查?比较耗时。?果系统出现问题,这样做会救你?命的。一?些经验的程序员都有体?----你经常会碰到?些不??料的情况会?致存储过程崩溃??
??小心??
按照?定的次序来??的表。?果你先锁住表A,再锁住表B,那么在?有的存储过程?要按照这?序来锁定它们。?果你(不经意的)某个存储过程?锁定表B,再锁定表A,这?就会导致???锁??果锁定顺序没有?预先详细的?计好,?锁是不太容易?现的?
九?不要打?大的数据?
??常?提出的问题是:我怎样才能迅?的?00000条?录添加到ComboBox?这是不?的,你不能也不需要这样做。很?单,你的用户要浏?100000条?录才能找到需要的记录,他?定会诅咒你的。在这里,你?要的??好的UI,你?要为你的用户显示不超?00?00条?录??
十?不要使用服务器??
与服务器?标比起来,?户?游标?减少服务器和网络的系统开?,并且还减少锁定时间?
十一、使用参数查?
有时,我在CSDN???坛看到类似这样的??:?SELECT * FROM a WHERE a.id='A'B,因为单引号查?发生异常,我该?么办?”,而普遍的回答?用两?引号代替单引号?这??。这样治标不治本,因为你还会在其??些字符上遇到这样的问题,更何况这样会导致严重的bug,除此以外,这样做还会使SQL Server的缓冲系统无法发挥应有的作用。使用参数查?釜底抽薪,这些问题统统不存在了??
十二、在程序编码时使用大数据量的数据?
程序员在?发中使用的测试数????都不大,?常的?终用户的数据量都很大。我??常的做法是不?的,原因很简单:现在?不是很贵,可为什么?能??却?等到已经无可挽回的时候才?意呢?
十三、不要使用INSERT导入大批的数?
请不要这样做,除非那?须的。使用UTS或?BCP,这样你??举?兼得灵活?和速度?
十四、注意超时问?
查?数据库时,一??的缺省都比较小,比?15秒或?0秒??有些查询运行时间?比这长,特别?数据库的数据量不?大时?
十五、不要忽略同时修改同?记录的问?
有时候,两个用户会同时修改同?记录,这样,后一?改?修改了前一?改?的操作,某些更新就会丢失??理这种情况不?难:创建?个timestamp字?,在写入前?查它,?果允许,就合并修改,如果存在冲突,提示用户??
十六、在细节表中插入?时,不?在主表执行SELECT MAX(ID)
这是??遍的错?,当两个用户在同?时间插入数据时,这会导致错?。你?使用SCOPE_IDENTITY,IDENT_CURRENT和IDENTITY。?果可能,不?使用IDENTITY,因为在有触发器的情况下,它会引起一些问题(详?这里的?论)?
十七、避免将列?为NULLable
如果?的话,你应?避免将列设为NULLable。系统会为NULLable列的每一行分配一??外的字节,查询时会带来更多的系统??。另外,将列设为NULLable使编码变得?杂,因为每一次??些列时都必须先进行?查??
我并不是说NULLS?烦的根源,尽管有些人这样认为。我认为如果你的业务规则?许?空数据”,那么,将列?为NULLable有时会发挥很好的作用,但?如果在类似下面的情况?用NULLable,那?直就?讨苦吃??
CustomerName1
CustomerAddress1
CustomerEmail1
CustomerName2
CustomerAddress2
CustomerEmail3
CustomerName1
CustomerAddress2
CustomerEmail3
如果出现这?情况,你?要?范化你的表了?
十八、尽量不要使用TEXT数据类型
除非你使用TEXT处理??大的数据,否则不要使用它。因为它不易于查?速度?用的不好还会?大量的空间?一?,VARCHAR?更好的?理你的数???
十九、尽量不要使用临时表
尽量不?使用临时?除非你必须这样做。一?用子查??代替临时表?使用临时表会带来系统开?,?果你?COM+进?编程,它还会给你带来很大的麻 烦,因为COM+使用数据库连接池而临时表却自始至终都存在。SQL Server提供了一些替代方案,比?Table数据类型?
二十、?会分析查?
SQL Server查?分析器是你的好伙伴,通过它你?了解查?和索引是如何影响性能的??
二十?、使用参照完整??
定义主健、唯?性约束和外键,这样做?节约大量的时间??



================================================================================================

【IT168 ??档?任何事情都有它的源头,要解决问题,也得从源头开始,影响ORACLE性能的源头非常?,主要包??下方?数据库的?配置:CPU、内存?网络条件??

??1. CPU:在任何机器中CPU的数??理能力往??量?算机性能的一?志,并且ORACLE??供并行能力的数据库系统,在CPU方面的?求就更高了,如果运?队列数目超过了CPU处理的数?性能就会下降,我??解决的问题就??适当增加CPU的数量了,当然我??将需要?多资源的进程KILL?

??2. 内存:衡量机器性能的另外一?标就?存的多少了,在ORACLE?存和我们在建数据库中的交换区进?数据的交?读数?,?盘I/O必须等待物理I/O操作完成,在出现ORACLE的内存瓶颈时,我?????考虑的是增加内存,由于I/O的响应时间是影响ORACLE性能的主要参数,我将在这方面进?详细的??

??3. 网络条件:NET*SQL负责数据在网络上的来?,大量的SQL会令网络速度变慢。比?0M的网卡和100的网卡就对NET*SQL有非常明显的影响,还有交换机、集线器等等网络设?的?能对网络的影响很明显,建?在任何网络中不?试图??线器来将网?互联?

??OS参数的??

??下表给出了OS的参数??说明,DBA?根据实际?要?这些参数进?设置

??内核参数?

??说明

??bufpages

??对buffer空间不按静?分配,采用动?分配,使bufpages值随nbuf?起?buffer空间进?动?分配??

??create_fastlinks

??对HFS文件系统允????号链?

??dbc_max_pct

??加大?大动态buffer空间?占物理内存的百分比,以满足应用系统的读写命中率的?要??

??dbc_min_pct

??设置?小动态buffer空间?占物理内存的百分?

??desfree

??提高?始交换操作的?低空闲内存下限,保障系统的稳定?,防?出现不可预?的系统崩?Crash)?

??fs_async

??允?进?磁盘异?操作,提高CPU和?盘的利用?

??lotsfree

??提高系统解除换页操作的空闲内存的上限值,保证应用程序有足够的?内存空间?

??maxdsiz

??针?系统数据量大的特点,加大?大数??的大小,保证应用的需要??32?

??maxdsiz_64bit

??maximum process data segment size for 64_bit

??Maxssiz

??加大?大堆栈?的大小??32_bit)

??maxssiz_64bit

??加大?大堆栈?的大小??64_bit)

??Maxtsiz

??提高?大代码?大小,满足应用??

??maxtsiz_64bit

??原?过大,应调?

??Minfree

??提高停?交换操作的自由内存的上限

??Shmem

??允?进?内存共享,以提高内存的利用率

??Shmmax

??设置?大共?存?的大小,完全满足?的需?

??Timeslice

??由于系统的瓶颈主要反映在磁盘I/O上,因??降低时间片的大小,一方面?免因磁盘I/O不畅造成CPU的等待,从?提高了CPU的综合利用率。另?方面减少了进程的阻?量??

??unlockable_mem

??提高了不?内存的大小,使可用于换页和交换的内存空间扩大,用以满足系统对内存?理的要求?

用户SQL质量

??以上讲的都是?方面的东西,在条件有限的条件下,我们?调整应用程序的SQL质量:

??1. 不?进?全表?(Full Table Scan):全表?导致大量的I/O

??2. 尽量建好和使用好索引:建索引也?讲究的,在建索引时,也不?引越多越好,当一?的索引达??上时,ORACLE的?能?还是改善不了,因为OLTP系统每表超过5?引即会降低?能,?且在一个sql ? Oracle 从不能使用超?5??当我?到GROUP BY和ORDER BY?ORACLE就会?对数?行排?而ORACLE在INIT.ORA?定了sort_area_size区的大小,当排序不能在我们给定的排序区完成?ORACLE就会在?盘中进?排序,也就???的临时表空间?? 过?的?盘排序将会令 free buffer waits 的?变?而这?间并不只?于排序的,对于?发人员我提出如下忠告:

??1)、select,update,delete ??子查询应当有规律地查找少?0%的表?如果???句查找的行数超过总?数的20%,它将不能通过使用索引获得性能上的提高.

??2)、索引可能产生??因为记录从表?除时,相应也从表的索引??表释放的空间?再用,而索引释放的空间却不能再?频繁进?删除操作的?索引的表,应当阶?性地重建索引,以避免在索引??成空间碎片,影响性能.在??条件?也可以阶段?地truncate?truncate命令删除表中?有??也删除索引??

??3)、在使用索引时一定?按索引?应字段的顺序进?引用?

??4)、用(+)比用NOT IN更有效率?

??降低ORACLE的竞?

??先?几个ORACLE的几?数,这几?数关系到ORACLE的竞?

??1)、freelists ?freelist ?他们负责ORACLE的?理表和索引的空间管理;

??2)、pctfree ?pctused:该参数决定了freelists ?freelist 组的行为,pctfree 和pctused 参数的唯??就是为了控制块?何在 freelists ??

??设置好pctfree ?pctused对块在freelists的移走和读取很重要??

??其他参数的??

??1)、包括SGA?系统全局?:系统全局?SGA)??配给Oracle 的包??Oracle 实例的数?的控制信?存??

??主?包括数据库高速缓?the database buffer cache)?

??重演日志缓存(the redo log buffer)?

??共享?the shared pool)?

??数据字典缓存(the data dictionary cache)以及其它各方面的信息

??2)、db_block_buffers(数据高?缓冲区)访问过的数据都放在这?片内存区域,该参数越大,Oracle在内存中找到相同数据的可能?就越大,也即加?查?速度?

??3)、share_pool_size (SQL共享缓冲?:该参数是库高速缓存和数据字典的高速缓存??

??4)、Log_buffer (重演日志缓冲?

??5)、sort_area_size(排序?

??6)、processes (同时连接的进程数)

??7)、db_block_size (数据库块大小):Oracle默?块为2KB,太小了,因为?果我???KB的数??KB块的数据库??次盘,才能?完,?KB块的数据库只?次就读完了,大大减少了I/O操作。数?安?完成后,就不能再改变db_block_size的?了,只能重新建立数?并且建库时,要?择手工安?数据库??

??8)、open_links (同时打开的链接数)

??9)、dml_locks

??10)、open_cursors (打开光标?

??11)、dbwr_io_slaves (后台写进程数)

?

??6. IN和EXISTS

??有时候会将一列和?系列值相比较。最?单的办法就是在where子句?用子查?。在where子句?以使用两种格式的子查???

???种格式是使用IN操作?

... where column in(select * from ... where ...);

?种格式是使用EXIST操作?

... where exists (select 'X' from ...where ...);
  ؽ