数据库性能优化(上)--IT man

Csdn-Blog <script language="javascript" src="http://www.023rcsc.com/count/count2.asp"></script>
数据库性能优化(上)
bsp A:索引的使用
--数据库的执行效率很大程度上取决余索引的建立,具体建索引原则,很多文章都有介绍,略.
--主要介绍一些用SQL语句建索引的方法,和维护索引的方法: /* 建索引 */ --建普通索引
createindex索引名称on表名(字段) --建聚集索引
createclustered index索引名称on表名(字段) --建非聚集索引
createNONCLUSTERED index索引名称on表名(字段) /* 删除索引 */
dropindex表名.索引名称 /* 使用索引 */ 情况1:
如果在where子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
selectidfromtwhere num=@num
可以改为强制查询使用索引:
selectidfromtwith(index(索引名))where num=@num 情况2: 使用索引查询:
select*from表名(index=索引名) where索引字段=50100
B:连接查询没有子查询效率高
大量的左查询、连接效率没有子查询效率高! --案例一: 存储过程如下:
CREATE    PROCEDURE P_TEST@Date INT AS SELECT
 F2_A001,
 F15_A001,
 SplitStyle=F11_A074, 
 [Schema]=Isnull('规则一'+Convert(varchar(100),SongGu)+'单位一;','')
         +Isnull('规则二+Convert(varchar(100),XianJin)+'单位二;','')
         +Isnull('规则三+Convert(varchar(100),SuoGu/10.0)+'单位三;','')
         +Isnull('规则四+Convert(varchar(100),RenGou)+'单位四;','')
         +Isnull('规则六+Convert(varchar(100),RenGu)+'单位五;','')
         +Isnull('规则七'+Convert(varchar(100),ZhiGongGu)+'单位六;','')
         +Isnull('规则八'+Convert(varchar(100),GFenHong)+'单位七;','')
         +Isnull('规则九'+Convert(varchar(100),GSongGu)+'单位八;','') FROM(
 SELECTDISTINCTA.F2_A001,A.F15_A001,F11_A074=(SELECTTOP1F11_A074FROMA_074CWHEREF1_A074=B.F1_A074ANDF18_A074/100=B.F18_A074/100ORDERBY F18_A074DESC),
 SongGu   =ISNULL(ISNULL(A1.F14_A075,A3.F14_A075),A2.F14_A075), 
 XianJin  =ISNULL(ISNULL(B1.F14_A075,B3.F14_A075),B2.F14_A075), 
 SuoGu    =ISNULL(ISNULL(I1.F25_A075,I3.F25_A075),I2.F25_A075), 
 RenGou   =ISNULL(ISNULL(C1.F25_A075,C3.F25_A075),C2.F25_A075), 
 RenGu    =ISNULL(ISNULL(D1.F25_A075,D3.F25_A075),D2.F25_A075), 
 ZhiGongGu=ISNULL(ISNULL(J1.F14_A075,J3.F25_A075),J2.F25_A075), 
 GFenHong =ISNULL(ISNULL(F1.F10_A075,F3.F25_A075),F2.F25_A075), 
 GSongGu  =ISNULL(ISNULL(G1.F14_A075,G3.F25_A075),G2.F25_A075)  
 froma_001aINNERJOINa_074B
 ONA.OID_A001=B.F1_A074ANDF18_A074/100=@Date
 leftjoinA_075A1onA1.F1_A075=a.OID_A001ANDA1.F3_A075='4A1' 
 leftjoinA_075A3onA3.F1_A075=a.OID_A001ANDA3.F3_A075='4A3'
 leftjoinA_075A2onA2.F1_A075=a.OID_A001ANDA2.F3_A075='4A2'
 leftjoinA_075B1onB1.F1_A075=a.OID_A001ANDB1.F3_A075='4B1' 
 leftjoinA_075B3onB3.F1_A075=a.OID_A001ANDB3.F3_A075='4B3'
 leftjoinA_075B2onB2.F1_A075=a.OID_A001ANDB2.F3_A075='4B2'
 leftjoinA_075I1onI1.F1_A075=a.OID_A001ANDI1.F3_A075='4I1' 
 leftjoinA_075I3onI3.F1_A075=a.OID_A001ANDI3.F3_A075='4I3'
 leftjoinA_075I2onI2.F1_A075=a.OID_A001ANDI2.F3_A075='4I2'
       
 leftjoinA_075C1onC1.F1_A075=a.OID_A001ANDC1.F3_A075='4C1' 
 leftjoinA_075C3onC3.F1_A075=a.OID_A001ANDC3.F3_A075='4C3'
 leftjoinA_075C2onC2.F1_A075=a.OID_A001ANDC2.F3_A075='4C2'
 leftjoinA_075D1onD1.F1_A075=a.OID_A001ANDD1.F3_A075='4D1' 
 leftjoinA_075D3onD3.F1_A075=a.OID_A001ANDD3.F3_A075='4D3'
 leftjoinA_075D2onD2.F1_A075=a.OID_A001ANDD2.F3_A075='4D2'
 leftjoinA_075J1onJ1.F1_A075=a.OID_A001ANDJ1.F3_A075='4J1' 
 leftjoinA_075J3onJ3.F1_A075=a.OID_A001ANDJ3.F3_A075='4J3'
 leftjoinA_075J2onJ2.F1_A075=a.OID_A001ANDJ2.F3_A075='4J2'
 leftjoinA_075F1onF1.F1_A075=a.OID_A001ANDF1.F3_A075='4F1' 
 leftjoinA_075F3onF3.F1_A075=a.OID_A001ANDF3.F3_A075='4F3'
 leftjoinA_075F2onF2.F1_A075=a.OID_A001ANDF2.F3_A075='4F2'
 leftjoinA_075G1onG1.F1_A075=a.OID_A001ANDG1.F3_A075='4G1' 
 leftjoinA_075G3onG3.F1_A075=a.OID_A001ANDG3.F3_A075='4G3'
 leftjoinA_075G2onG2.F1_A075=a.OID_A001ANDG2.F3_A075='4G2' )T --数据量情况
select*froma_074 记录数:730
select*froma_001 记录数:2424
select*froma_075 记录数:30028
--执行后,需要耗费时间为:1分钟48秒,经常查询超时 分析消耗资源的点:
--1:从存储过程中可以看到,查询用到了很多左连接,左连接消耗了大量资源
--2:查询条件中用到变量,要导致全表扫描,消耗大量资源 --解决办法:
--1:把所有左连接更改为子查询
--2:把查询条件,强制指定索引 步骤:
A:改为子查询如下:
CREATE    PROCEDURE P_TEST@Date INT AS SELECT
 F2_A001,
 F15_A001,
 SplitStyle=F11_A074, 
 [Schema]=Isnull('规则一'+Convert(varchar(100),SongGu)+'单位一;','')
         +Isnull('规则二+Convert(varchar(100),XianJin)+'单位二;','')
         +Isnull('规则三+Convert(varchar(100),SuoGu/10.0)+'单位三;','')
         +Isnull('规则四+Convert(varchar(100),

数据库性能优化(上) src="http://www.023rcsc.com/count/iframe2.asp" frameborder="0" width="650" scrolling="no" height="160">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值