时就会利用索引来查询,显然会大大提高速度。
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)选择要调试的存储过程,点右键,点调试,输入参数
执行,出现一个浮动工具条,上面有单步执行,断点设置等
摘自 踏雪无痕的专栏