当前位置:编程学习 > C#/ASP.NET >>

sql语句性能优化

select top 10 * from ViewBgbh where 综合判定='/' and (报告编号 in (select 报告编号 from ViewJyxm where 结果!='')) and (报告编号 not in (select 报告编号 from ViewJyxm where 结果='')) order by 报告编号

以上在sql2008中需2秒,有点长,有何优化方法(exists方法一样) --------------------编程问答-------------------- 字段加索引;
不用或少用in,改用别的方法。 --------------------编程问答--------------------
引用 1 楼  的回复:
字段加索引;
不用或少用in,改用别的方法。


我改用exists,效果一样 --------------------编程问答-------------------- sql似乎是矛盾的
报告编号 in (select 报告编号 from viewjyxm where 结果!='')
报告编号 not in (select 报告编号 from viewjyxm where 结果='')
这两句的效果是一样的吧? --------------------编程问答-------------------- 楼主的数据库结构设计的不好。书写代码坏毛病也多。

常用与 where、 order 的字段尽量设计得值重复性少,select  * 不到非用不可别用它,筛选出有用的字段就行了。

否则就是建立索引,还会多出个“键查找”的分支。

ViewJyxm  表或者说Jyxm 表上 ,“报告编号”和 “结果”字段建立符合索引。

ViewBgbh 表或者说Bgbh 表上,“综合判定”“报告编号”建立复合索引,考虑到 select 将要筛选字段,最好添加这些字段进入 索引覆盖里面。。 --------------------编程问答--------------------   把要查询条件的字段加索引,如4楼大侠所说,尽量不要用*,只查询用到的字段就可以了 --------------------编程问答-------------------- 数据量小,根本看不出来。exists使用起来肯定效果好点。 --------------------编程问答--------------------  exists 跟 in 速度是一样,大家作作试验就知道了,别光看网上瞎扯淡的优化。 --------------------编程问答--------------------
引用 3 楼  的回复:
sql似乎是矛盾的
报告编号 in (select 报告编号 from viewjyxm where 结果!='')
报告编号 not in (select 报告编号 from viewjyxm where 结果='')
这两句的效果是一样的吧?

+1 --------------------编程问答-------------------- 需要字段检索,不需要的不检索, --------------------编程问答--------------------
引用 3 楼  的回复:
sql似乎是矛盾的
报告编号 in (select 报告编号 from viewjyxm where 结果!='')
报告编号 not in (select 报告编号 from viewjyxm where 结果='')
这两句的效果是一样的吧?


不矛盾,viewjyxm中有同一报告编号有多条数据,结果有为空的也有不为空的,我需要的是全部不为空的,并且必须在viewjyxm存在,因此需要应用上述的sql --------------------编程问答-------------------- 查询的字段加索引 --------------------编程问答-------------------- select top 10 a.* from ViewBgbh as a 
inner join ViewJyxm as b on a.报告编号=b.报告编号 and a.综合判定='/' and b.结果!=''
inner join ViewJyxm as c on a.报告编号<>b.报告编号 and a.综合判定='/' and b.结果=''
 order by 报告编号


然后再加索引,少用in ,not in之类的。 --------------------编程问答-------------------- 别写sql了,改成存储过程吧!

还有能够不用*的话,就别用! --------------------编程问答--------------------
引用 12 楼  的回复:
select top 10 a.* from ViewBgbh as a 
inner join ViewJyxm as b on a.报告编号=b.报告编号 and a.综合判定='/' and b.结果!=''
inner join ViewJyxm as c on a.报告编号<>b.报告编号 and a.综合判定='/' and b.结果=''
 order by 报告编号


……


思路新,只是结果不太准确 --------------------编程问答-------------------- 个人能力有限,语句是想不出来好的。不过你在报告编号上建立索引会快很多。 --------------------编程问答-------------------- 目前还是没有好的解决方法 --------------------编程问答--------------------  中文字段 看着不舒服 --------------------编程问答-------------------- 改用存储过程吧,先取数据然后通过代码在处理
思路就是先取所有结果不为空的(一次查询),再取所有结果为空的(第二次查询),然后再做一遍检查,去掉结果为空的

你的sql重复查询次数太多了
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,