5
、 尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信息的字段
设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查
询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
6
、 合理使用
EXISTS,NOT EXISTS
子句。如下所示:
1.SELECT SUM(T1.C1)FROM T1 WHERE(SELECT COUNT(*)FROM T2 WHERE
T2.C2=T1.C2>0)
2.SELECT SUM(T1.C1) FROM T1WHERE EXISTS(SELECT * FROM T2 WHERE
T2.C2=T1.C2)
两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表
扫描或是索引扫描。如果你想校验表里是否存在某条纪录,不要用
count(*)
那样效率很低,
而且浪费服务器资源。可以用
EXISTS
代替。如:
IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')
可 以 写 成 :
IF
EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')
经常需要写一个
T_SQL
语句比较一个父结果集和子结果集,从而找到是否存在在父结果集
中有而在子结果集中没有的记录,如:
1.SELECT a.hdr_key FROM hdr_tbl a---- tbl a
表示
tbl
用别名
a
代替
WHERE NOT EXISTS
(SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key)
2.SELECT a.hdr_key FROM hdr_tbl a LEFT JOIN dtl_tbl b ON a.hdr_key = b.hdr_key WHERE
b.hdr_key IS NULL
3.SELECT hdr_key FROM hdr_tbl WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl)
三种写法都可以得到同样正确的结果,但是效率依次降低。
7
、 尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引 。
见如下例子:
SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
SELECT * FROM T1 WHERE NAME LIKE ‘L%’
即使
NAME
字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全
表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。
51ruan.com
8
、 分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在
WHERE
子句中将连接条件完整的写上,有可能大大提高查询速度。例:
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO =
B.CARD_NO
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO =
B.CARD_NO AND A.ACCOUNT_NO=B.ACCOUNT_NO
第二句将比第一句执行快得多。
9
、 消除对大型表行数据的顺序存取
评论