sql效率问题,请大神解惑!

frankl123 2014-12-02 04:37:02

and
(
1=1
or deptid in (select deptid from dbo.pub_getRoleUserAndDeptid('6,7') where st_id = 1)
or createDeptid in (select deptid from dbo.pub_getRoleUserAndDeptid('6,7') where st_id = 1)
)

表中共12W行数据
条件中去掉1=1 执行时间不到1秒
条件中加上1=1 执行时间6秒

表中没有建任何索引,请大神解惑
另外如何查看执行计划!
...全文
279 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
shinger126 2014-12-03
  • 打赏
  • 举报
回复
select * from 表 where 1=1 or id =834 等同于select * from 表, 其他的几句 2、select * from 表 where id =834 用时不到1秒。 3、select * from 表 where 1=2 or id =834 用时不到1秒。 4、select * from 表 where 1=1 and id =834 用时不到1秒。 基本上等同于select * from 表 where id =834 第一个语句会返回此表中所有的数据,并且无法使用索引,差异当然明显
Sasayau 2014-12-03
  • 打赏
  • 举报
回复
or应该对IO影响很大
frankl123 2014-12-02
  • 打赏
  • 举报
回复
引用 17 楼 zbdzjx 的回复:
再补充一点: select * from 表 where 1=1 or id =834 等于 select * from 表 我刚试了一下,“select * from 表”也是要14秒。这样看来,14秒应该是花费在了数据的传输上了。
1=1与or的关系 select * from table 没有where条件
frankl123 2014-12-02
  • 打赏
  • 举报
回复
引用 16 楼 zbdzjx 的回复:
刚才找了一个表测试了一下。 1、select * from 表 where 1=1 or id =834 用时14秒。 2、select * from 表 where id =834 用时不到1秒。 3、select * from 表 where 1=2 or id =834 用时不到1秒。 4、select * from 表 where 1=1 and id =834 用时不到1秒。 总结一下,如果是or,1=1对查询速度有很大影响,而1=2则没影响;如果是and,1=1对查询速度没多大影响。
恩我刚也试了一下 or的时候1=1对效率影响很大,and的时候则没什么影响
	creator=1
	or
	(
	  
	 deptid in (select deptid from dbo.pub_getRoleUserAndDeptid('6,7') where st_id = 1)
	 or 
	 createDeptid in (select deptid from dbo.pub_getRoleUserAndDeptid('6,7') where st_id = 1)
	)
把1=1换成表中字段creator=1的时候or与and效率也相差很大 语句单独执行都很快加起来都没1秒,放一起就很慢了将近30秒
zbdzjx 2014-12-02
  • 打赏
  • 举报
回复
再补充一点: select * from 表 where 1=1 or id =834 等于 select * from 表 我刚试了一下,“select * from 表”也是要14秒。这样看来,14秒应该是花费在了数据的传输上了。
zbdzjx 2014-12-02
  • 打赏
  • 举报
回复
刚才找了一个表测试了一下。 1、select * from 表 where 1=1 or id =834 用时14秒。 2、select * from 表 where id =834 用时不到1秒。 3、select * from 表 where 1=2 or id =834 用时不到1秒。 4、select * from 表 where 1=1 and id =834 用时不到1秒。 总结一下,如果是or,1=1对查询速度有很大影响,而1=2则没影响;如果是and,1=1对查询速度没多大影响。
还在加载中灬 2014-12-02
  • 打赏
  • 举报
回复
引用 8 楼 frankl123 的回复:
[quote=引用 4 楼 ky_min 的回复:] 这就是,喜欢把1=1或者1=2带入SQL条件需要的代价 普遍认为,使用了“1=1”这样的过滤条件后数据库就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描以比较此行是否满足过滤条件,当表中的数据量非常大的时候效率会显得非常慢。因此如果数据检索对性能有比较高的要求就不要使用这种“简便”的方法进行检索 你把and()这整条件去掉,看下速度怎么样
热心人经常看见你回答问题,再问下如果在条件中加入标量值函数staffrole(@OperUserID, 321)=1 是不是也等价于1=1这种情况了。[/quote]应该是一样的 从你说的表扫描100%开销看来,是这样 你把标量值的函数的执行计划也看下 另外,执行计划找原因,大版很强悍,我只是在书上小窥几页而已~~
frankl123 2014-12-02
  • 打赏
  • 举报
回复
引用 12 楼 DBA_Huangzj 的回复:
你有完整一点的代码不?

發糞塗牆 2014-12-02
  • 打赏
  • 举报
回复
你把截图另存为一个文件用这里上传
發糞塗牆 2014-12-02
  • 打赏
  • 举报
回复
你有完整一点的代码不?
frankl123 2014-12-02
  • 打赏
  • 举报
回复
引用 7 楼 DBA_Huangzj 的回复:
不复杂的话贴出来,复杂的话把百分比最高的那(些)部分贴出来

上不了图,传不上去。带着1=1的话就两个select 开销:0% 后边是个表扫描100%
如果不带1=1的话有好多,很复杂。
hepe00 2014-12-02
  • 打赏
  • 举报
回复
引用 9 楼 hepe00 的回复:
and
(
  1=1 
  or exists(select 1 from dbo.pub_getRoleUserAndDeptid('6,7') as b 
			where st_id = 1 and (a.deptid=b.deptid or a.createDeptid=b.deptid)
)
建议首先计算值staffrole(@OperUserID, 321)=1,再使用case when 做下一步的查询。
hepe00 2014-12-02
  • 打赏
  • 举报
回复
and
(
  1=1 
  or exists(select 1 from dbo.pub_getRoleUserAndDeptid('6,7') as b 
			where st_id = 1 and (a.deptid=b.deptid or a.createDeptid=b.deptid)
)
frankl123 2014-12-02
  • 打赏
  • 举报
回复
引用 4 楼 ky_min 的回复:
这就是,喜欢把1=1或者1=2带入SQL条件需要的代价 普遍认为,使用了“1=1”这样的过滤条件后数据库就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描以比较此行是否满足过滤条件,当表中的数据量非常大的时候效率会显得非常慢。因此如果数据检索对性能有比较高的要求就不要使用这种“简便”的方法进行检索 你把and()这整条件去掉,看下速度怎么样
热心人经常看见你回答问题,再问下如果在条件中加入标量值函数staffrole(@OperUserID, 321)=1 是不是也等价于1=1这种情况了。
發糞塗牆 2014-12-02
  • 打赏
  • 举报
回复
不复杂的话贴出来,复杂的话把百分比最高的那(些)部分贴出来
frankl123 2014-12-02
  • 打赏
  • 举报
回复
引用 5 楼 DBA_Huangzj 的回复:
ctrl+m,然后执行你的语句,就有一个图出现
黄大大偶就想问那个图咋看!
發糞塗牆 2014-12-02
  • 打赏
  • 举报
回复
ctrl+m,然后执行你的语句,就有一个图出现
还在加载中灬 2014-12-02
  • 打赏
  • 举报
回复
这就是,喜欢把1=1或者1=2带入SQL条件需要的代价 普遍认为,使用了“1=1”这样的过滤条件后数据库就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描以比较此行是否满足过滤条件,当表中的数据量非常大的时候效率会显得非常慢。因此如果数据检索对性能有比较高的要求就不要使用这种“简便”的方法进行检索 你把and()这整条件去掉,看下速度怎么样
frankl123 2014-12-02
  • 打赏
  • 举报
回复
引用 2 楼 hepe00 的回复:
and
(
  1=1 
  and( deptid in (select deptid from dbo.pub_getRoleUserAndDeptid('6,7') where st_id = 1)
  or createDeptid in (select deptid from dbo.pub_getRoleUserAndDeptid('6,7') where st_id = 1))
)
我想知道你改为这样执行,效果如何。
上边的1=1中前边的1是传入的参数
hepe00 2014-12-02
  • 打赏
  • 举报
回复
and
(
  1=1 
  and( deptid in (select deptid from dbo.pub_getRoleUserAndDeptid('6,7') where st_id = 1)
  or createDeptid in (select deptid from dbo.pub_getRoleUserAndDeptid('6,7') where st_id = 1))
)
我想知道你改为这样执行,效果如何。
加载更多回复(1)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧