100分 大家都来讨论讨论sql语句优化的问题

pupil2003 2005-03-11 11:30:02
我有一个短程序如下:
select * from (
select arg.bld_grp_desc,g.group_name,p.* from tb_person p,tb_group g,tb_abo_rh_grp arg
where g.group_id=p.group_id
and arg.bld_grp_id=p.bld_grp_id
and p.id_card like @idcard18
union
select arg.bld_grp_desc,g.group_name,p.* from tb_person p,tb_group g,tb_abo_rh_grp arg
where g.group_id=p.group_id
and arg.bld_grp_id=p.bld_grp_id
and p.id_card like @idcard15
)qqq
order by bld_grp_desc,name

我在id_card字符串类型,建了索引,idcard15 和idcard18分别为15位和18位身份证号,表内大约有35万条数据,大部分情况下可在3秒内查出结果,有百分之2-3的机会查询会超时(大于)3分钟,大家帮我看看语句到底有什么问题
...全文
161 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
pupil2003 2005-03-11
  • 打赏
  • 举报
回复
我通过少量的实验无法捕捉到这一问题,这个问题是客户反映的,搞不懂为什么会时好时坏
pupil2003 2005-03-11
  • 打赏
  • 举报
回复
谢谢,@idcard15和@idcard18不带通配符
另外 Softlee81307(孔腎)朋友的写法用了or操作不是会造成对表的顺序存取吗?这要效率要低于union操作吧。
dzhfly 2005-03-11
  • 打赏
  • 举报
回复
用第一楼吧 或这样不行吗
select arg.bld_grp_desc,g.group_name,p.* from tb_person p,tb_group g,tb_abo_rh_grp arg
where g.group_id=p.group_id
and arg.bld_grp_id=p.bld_grp_id
and (p.id_card like @idcard18
or p.id_card like @idcard15 )order by bld_grp_desc,name
wyb0026 2005-03-11
  • 打赏
  • 举报
回复
like 最好能不用就不用不要用
子陌红尘 2005-03-11
  • 打赏
  • 举报
回复
传入参数@idcard15和@idcard18的值是什么格式?带有通配符?

如果带有通配符,那么当传入的格式是'%xxxx%'以及'%xxxx'时,无法使用索引查找,将导致全表扫描
这也就是"为什么有百分之2-3的机会查询会超时(大于)3分钟"的问题的原因了
Softlee81307 2005-03-11
  • 打赏
  • 举报
回复
-----改成一起就行了
select * from (
select arg.bld_grp_desc,g.group_name,p.* from tb_person p,tb_group g,tb_abo_rh_grp arg
where g.group_id=p.group_id
and arg.bld_grp_id=p.bld_grp_id
and (p.id_card like @idcard18
or p.id_card like @idcard15 )
)qqq
order by bld_grp_desc,name
pupil2003 2005-03-11
  • 打赏
  • 举报
回复
多谢,我再仔细测试一下程序
zjcxc 元老 2005-03-11
  • 打赏
  • 举报
回复
单机和并发并不冲突嘛,正如你说的,程序逻辑设置如果不太好的好,就可能出现此问题

因为问题是偶尔且没有固定条件下出现的,我认为锁的原因比较大
pupil2003 2005-03-11
  • 打赏
  • 举报
回复
另,zjcxc(邹建)及个位仁兄,我的QQ:16847315欢迎指教
pupil2003 2005-03-11
  • 打赏
  • 举报
回复
不好意思,首先纠正一下“@idcard15和@idcard18不带通配符”应该是“@idcard15和@idcard18左侧不带通配符”,也就是说理论上是能够利用索引的。

zjcxc(邹建) 老兄,你也来了,多谢支持。
这个程序用的是单机数据库,不存在并发操作的问题,不过不能排除前面有操作未完成的情况,如果有动作未提交的话,会出现此类问题是吧?
zjcxc 元老 2005-03-11
  • 打赏
  • 举报
回复
表内大约有35万条数据,大部分情况下可在3秒内查出结果,有百分之2-3的机会查询会超时(大于)3分钟

这个不一定是查询问题,有可能在你查询的时候,其他处理进程锁住了被查询的表,这样查询必须锁释放才能继续执行,这时自然速度就慢了


要确定是锁还是查询条件的问题,你可以让用户记录下查询慢时的各种查询条件,对这些进行分析即可
子陌红尘 2005-03-11
  • 打赏
  • 举报
回复
@idcard15和@idcard18不带通配符
-----------------------------------------------
那就不要用like,直接用=就得了,呵呵

用DBCC CHECKTABLE试试,也许是存储数据的磁盘的块有问题吧
lishengyu 2005-03-11
  • 打赏
  • 举报
回复

and p.id_card like @idcard15
而@idcard15 里没有通配符
这不等效于
p.id_card =@idcard15
 吗
如果是这样的话,把原来的like 改成= 号,
效率将是最快的

34,577

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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