SQL SERVER 性能优化(强制使用索引查询)

本文介绍了如何通过创建和使用索引来优化SQL Server的查询性能。针对where子句中使用参数导致的全表扫描问题,提出了使用with(index)强制索引查询的方法。此外,通过将左连接转换为子查询,显著提高了存储过程的执行效率。同时,建议为表a_074和A_075创建索引以加速查询。经过优化,查询时间从原来的1分钟48秒降低到小于1秒。

A:索引的使用

--数据库的执行效率很大程度上取决于索引的建立,具体建索引原则,很多文章都有介绍,略.
--主要介绍一些用SQL语句建索引的方法,和维护索引的方法:

/*
建索引
*/
--建普通索引
create index 索引名称 on 表名(字段)
--建聚集索引
create clustered  index 索引名称 on 表名(字段)
--建非聚集索引
create NONCLUSTERED  index 索引名称 on 表名(字段)

/*
删除索引
*/
drop index 表名.索引名称

/*
使用索引
*/

情况1:
如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(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 (
 SELECT DISTINCT A.F2_A001, A.F15_A001, F11_A074 = (SELECT TOP 1 F11_A074 FROM A_074 C WHERE F1_A074 = B.F1_A074 AND F18_A074 / 100 = B.F18_A074 / 100 ORDER BY  F18_A074 DESC),
 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&nbs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值