SQL语句中,where后面多添加了一个判断条件,执行时间从2秒升至50秒,这是由什么原因造成的?
if exists(select 0 from table_name) and 1=1 and 2=2 and exists(select 0 from table_name)begin print 'OK'endelsebegin print ''end
不论把(+)写在等号左边项还是右边项,统称为外连接
在内连接中,只返回那些在连接表中有匹配数据的数据行
外连接即在被连接的表中加入一个空行来与没有匹配行的数据进行匹配
比如查询员工所属的部门,总裁不属于任何部门,(老板不属于任何部门,dname项是空的)
select e.emp_name ename,d.dept_name dname
from emp e, dept d
where e.dept_no=d.dept_no(+)
ename dname
——————————
sam SALES
tom ACCOUNTING
king
对照下常用的优化方法:
2. 避免出现SELECT * FROM table 语句,要明确查出的字段。
3. 在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。
4. 查询时尽可能使用索引覆盖。即对SELECT的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。
5. 在判断有无符合条件的记录时建议不要用SELECT COUNT (*)和select top 1 语句。
6. 使用内层限定原则,在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句的最里层进行限定,以减少数据的处理量。
7. 应绝对避免在order by子句中使用表达式。
8. 如果需要从关联表读数据,关联的表一般不要超过7个。
9. 小心使用 IN 和 OR,需要注意In集合中的数据量。建议集合中的数据不超过200个。
10. <> 用 < 、 > 代替,>用>=代替,<用<=代替,这样可以有效的利用索引。
11. 在查询时尽量减少对多余数据的读取包括多余的列与多余的行。
12. 对于复合索引要注意,例如在建立复合索引时列的顺序是F1,F2,F3,则在where或order by子句中这些字段出现的顺序要与建立索引时的字段顺序一致,且必须包含第一列。只能是F1或F1,F2或F1,F2,F3。否则不会用到该索引。
13. 多表关联查询时,写法必须遵循以下原则,这样做有利于建立索引,提高查询效率。格式如下select sum(table1.je) from table1 table1, table2 table2, table3 table3 where (table1的等值条件(=)) and (table1的非等值条件) and (table2与table1的关联条件) and (table2的等值条件) and (table2的非等值条件) and (table3与table2的关联条件) and (table3的等值条件) and (table3的非等值条件)。
注:关于多表查询时from 后面表的出现顺序对效率的影响还有待研究。
14. 子查询问题。对于能用连接方式或者视图方式实现的功能,不要用子查询。例如:select name from customer where customer_id in ( select customer_id from order where money>1000)。应该用如下语句代替:select name from customer inner join order on customer.customer_id=order.customer_id where order.money>100。
15. 在WHERE 子句中,避免对列的四则运算,特别是where 条件的左边,严禁使用运算与函数对列进行处理。比如有些地方 substring 可以用like代替。
16. 如果在语句中有not in(in)操作,应考虑用not exists(exists)来重写,最好的办法是使用外连接实现。
17. 对一个业务过程的处理,应该使事物的开始与结束之间的时间间隔越短越好,原则上做到数据库的读操作在前面完成,数据库写操作在后面完成,避免交叉。
18. 请小心不要对过多的列使用列函数和order by,group by等,谨慎使用disti软件开发t。
19. 用union all 代替 union,数据库执行union操作,首先先分别执行union两端的查询,将其放在临时表中,然后在对其进行排序,过滤重复的记录。
当已知的业务逻辑决定query A和query B中不会有重复记录时,应该用union all代替union,以提高查询效率。
评论0
那谁知道,SQL粘出来看看,估计多了个条件影响索引了吧
有一种树,长得挺高的,而且叶子挺大的,开的花像桂花,是白色的,但是很臭...
糖胶树 http:\/\/baike.baidu.com\/link?url=2wHEcvfZaKB01pbv4Ufc_M5n9qljN4l5i5BedDtgmTbZ_bv0UJh_CdRz5KO2MHuK
祝贺结婚怎么说
朋友结婚祝福语: 1 愿天下有情人终成眷属,前生注定,喜结良缘。 P}WhE ="w8U' 2 新婚大喜!百年好合! VBsFT2XiL \\ NSw<. 3 你们本就是天生一对,地造一双,而今共偕连理,今后更需彼此宽容、互相照顾,祝福你们! OK2\/k_jXN' L5qCv -{ 4 愿你俩用爱去缠着对方,彼此互相体谅和关怀,共同分享今后的苦...
我希望变成一只小鸟作文 咋写 快点 范文
我想变成一只美丽的小鸟,在天空中自由自在的飞翔。我想变成小鸟的样子非常美丽。我的羽毛都是彩色的,头上的羽毛是白色的。嘴是红色的,爪子是橘黄色的头上有一些毛,那些毛特别像王冠。我能在蔚蓝的天空中,自由自在的飞翔。我能从高高的天空中看见高高的大楼、宽宽的马路、小小的人群···在天空中自...
有一种树,长得挺高的,而且叶子挺大的,开的花像桂花,是白色的,但是很臭...
糖胶树 http:\/\/baike.baidu.com\/link?url=2wHEcvfZaKB01pbv4Ufc_M5n9qljN4l5i5BedDtgmTbZ_bv0UJh_CdRz5KO2MHuK
微盾五羚: 1、update 表名 set [where] 例如 修改students表中,把所有学员性别改成为0(女性) update students set sex=0.
清徐县13030849259: asp sql 语句 where 多个数字变量怎么使用 - ?
微盾五羚: 用 or 或 and 连接 where 后面的条件 比如:where (p_jiage>50 or p_jiage<6) and p_jiage>=13 注意括号的使用
清徐县13030849259: sql 查询语句中 能否添加两个 where 条件 - ?
微盾五羚: 条件用 and 连接
清徐县13030849259: sql查询的where条件为什么要加1,完整格式变成select * from * where 1 and * and*.... - ?
微盾五羚: 一般都是where 1 = 1 ,而不是where 1 where 1 = 1得好处在于当你需要增加一个条件的时候不用考虑前面的条件是什么样,直接可以添加and xxx 或者or = xxx,如果没有where 1 = 1,如果你是第一个条件你必须要写 xxx, 如果不是第一个条件才可以直接and xxx
清徐县13030849259: select count(*) from aa where sql语句 B - ?
微盾五羚: 能加where 但是你这种写法是不对的后面的select 只能是某列的数据,不能是* 比如 select count(*) from aa where 列名 可已是in ,not in ,= ,exists, not exists加(select 语句)
清徐县13030849259: 一个select语句,where条件是有选择的添加,怎么写 - ?
微盾五羚: where后加多个条件可以用and来连接. 如,student表中有如下数据: 现在要查,sex为男,age为20的那些数据,可用如下语句: select * from student where sex='男' and age=20;结果截图:
清徐县13030849259: 请问在SQL中where后能跟的数据类型有哪些? - ?
微盾五羚: 一般多是使用where 1=1 ,常见在程序中使用,这是为了使用“where”,然后后面根据条件判断进行选择添加条件,如: String sql = " select id, name, english from student where 1=1 "; if(...){sql +=" and name ='Tom' "; }
清徐县13030849259: 求助关于sql语句中多where条件的写法 - ?
微盾五羚: 多条件的写法类似下面:select * from table where col_1=value1 and col_2=value2 and col_3 > 1000; 具体就要靠自己领悟了!
清徐县13030849259: sql语句中where后怎么加数组 - ?
微盾五羚: --1. 构造使用IN子句的动态Transact-SQL方法进行编号查询--a. 要查询的字段类型是数字型--查询的值列表 DECLARE @idlist varchar(100) SET @idlist='1,2,3'--拼接并执行动态Transact-SQL语句 EXEC('SELECT * FROM tbname WHERE ...
清徐县13030849259: 请教一下,SQL语句where语句中,在条件后面加了“(+)”,是什么意思?比如WHERE SID=TID(+) - ?
微盾五羚: 不论把(+)写在等号左边项还是右边项,统称为外连接 在内连接中,只返回那些在连接表中有匹配数据的数据行 外连接即在被连接的表中加入一个空行来与没有匹配行的数据进行匹配 比如查询员工所属的部门,总裁不属于任何部门,(老板不属于任何部门,dname项是空的) select e.emp_name ename,d.dept_name dname from emp e, dept d where e.dept_no=d.dept_no(+) ename dname —————————— sam SALES tom ACCOUNTING king