设为首页 加入收藏

TOP

分享一些数据库使用的心得 (二)
2014-11-24 01:03:20 来源: 作者: 【 】 浏览:14
Tags:分享 一些数据库 使用 心得

时就会利用索引来查询,显然会大大提高速度。

11、 使用视图加速查询

把表的一个子集进行排序并创建视图,有时能加速查询。它有助于避免多重排序

操作,而且在其他方面还能简化优化器的工作。例如:

SELECT cust.name,rcvbles.balance,……other columns

FROM cust,rcvbles

WHERE cust.customer_id = rcvlbes.customer_id

AND rcvblls.balance>0

AND cust.postcode>“98000”

ORDER BY cust.name

如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个

视图中,并按客户的名字进行排序:

CREATE VIEW DBO.V_CUST_RCVLBES

AS

SELECT cust.name,rcvbles.balance,……other columns

FROM cust,rcvbles

WHERE cust.customer_id = rcvlbes.customer_id

AND rcvblls.balance>0

ORDER BY cust.name

然后以下面的方式在视图中查询:

SELECT *FROM V_CUST_RCVLBES

WHERE postcode>“98000”

视图中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘

I/O,所以查询工作量可以得到大幅减少。

12、 能够用BETWEEN的就不要用IN

SELECT * FROM T1 WHERE ID IN (10,11,12,13,14)

改成:

SELECT * FROM T1 WHERE ID BETWEEN 10 AND 14

因为IN会使系统无法使用索引,而只能直接搜索表中的数据。

13、DISTINCT的就不用GROUP BY

SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID

可改为:

SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10

14、 部分利用索引

1.SELECT employeeID, firstname, lastname

FROM names

WHERE dept = 'prod' or city = 'Orlando' or division = 'food'

2.SELECT employeeID, firstname, lastname FROM names WHERE dept =

'prod'

UNION ALL

SELECT employeeID, firstname, lastname FROM names WHERE city = 'Orlando'

UNION ALL

SELECT employeeID, firstname, lastname FROM names WHERE division =

'food'

如果dept 列建有索引则查询2可以部分利用索引,查询1则不能。

15、 能用UNION ALL就不要用UNION

UNION ALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源

16、 不要写一些不做任何事的查询

如:SELECT COL1 FROM T1 WHERE 1=0

SELECT COL1 FROM T1 WHERE COL1=1 AND COL1=2

这类死码不会返回任何结果集,但是会消耗系统资源。

17、 尽量不要用SELECT INTO语句。

SELECT INTO 语句会导致表锁定,阻止其他用户访问该表。

18、 必要时强制查询优化器使用某个索引

SELECT * FROM T1 WHERE nextprocess = 1 AND processid IN (8,32,45)

改成:

SELECT * FROM T1 (INDEX = IX_ProcessID) WHERE nextprocess = 1 AND

processid IN (8,32,45)

则查询优化器将会强行利用索引IX_ProcessID 执行查询。

19、 虽然UPDATE、DELETE语句的写法基本固定,但是还是对UPDATE语句给点建

议:

a) 尽量不要修改主键字段。

b) 当修改VARCHAR型字段时,尽量使用相同长度内容的值代替。

c) 尽量最小化对于含有UPDATE触发器的表的UPDATE操作。

d) 避免UPDATE将要复制到其他数据库的列。

e) 避免UPDATE建有很多索引的列。

f) 避免UPDATE在WHERE子句条件中的列。

上面我们提到的是一些基本的提高查询速度的注意事项,但是在更多的情况下,往往

需要反复试验比较不同的语句以得到最佳方案。最好的方法当然是测试,看实现相

同功能的SQL语句哪个执行时间最少,但是数据库中如果数据量很少,是比较不出

来的,这时可以用查看执行计划,即:把实现相同功能的多条SQL语句考到查询分

析器,按CTRL+L看查所利用的索引,表扫描次数(这两个对性能影响最大),总体

上看询成本百分比即可。

简单的存储过程可以用向导自动生成:在企业管理器工具栏点击运行向导图标,点

击”数据库”、”创建存储过程向导”。复杂存储过程的调试:在查询分析器左边

的对象浏览器(没有?按F8)选择要调试的存储过程,点右键,点调试,输入参数

执行,出现一个浮动工具条,上面有单步执行,断点设置等

摘自 踏雪无痕的专栏

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇NO-SQL领域及简介 下一篇走进Affinity之一:VMware开源数..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: