SQL2005大家一起来讨论下,没什么深度的。

春风十里耶耶耶 2011-05-25 10:35:18
引用
两个问题点:
1.同样的数据库表结构,同样的数据,表中有252483条数据。
在A服务器上查询,用户为010037用户的信息,用时5秒左右,查询出数据为114条左右。
在B服务器上查询,用户为010037用户的信息,用时3分左右,查询出数据为114条左右。

B服务器上有的是否查询过一遍之后,速度就正常了,但有时依然需要3分左右,虽然B服务器性能差点,但也不至于这样吧。

2.就以上面为例:
在一张拥有20W条数据的表中,我想查询010037的所有信息,下面的两种写法哪种快些,为什么呢?

select * from Table where UserCode='010037' --直接查询出
select * from Table where UserCode Like '%010%' and UserCode='010037'
还是上面的两种方法没有区别?

希望大家同时回答两个问题,不要只回答其中一个。
...全文
77 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2011-05-25
  • 打赏
  • 举报
回复
1."B服务器上有的是否查询过一遍之后,速度就正常了.."
这是缓存的问题,执行第一遍时系统将数据读取到内存中,即是物理读(physical reads).后面就直接从内存读取数据,即是逻辑读(logical reads),速度就快很多了.

2.select * from Table where UserCode='010037' --直接查询出
select * from Table where UserCode Like '%010%' and UserCode='010037'
应该没什么区别的,SQL引擎看到第2句where子句有UserCode='010037',会自动先去找UserCode的索引来用,然后再判断UserCode Like '%010%'.即"条件1 and 条件2" 等价于 "条件2 and 条件1". 但一般不建议这么写: UserCode Like '%010%'
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hlf1989 的回复:]
每一种情况感觉还是和机器的硬件以及软件环境有关,具体情况可以比较复杂,
需要楼主在尽量保证软硬件环境一致的情况下,找找原因

每二种情况,加Like '%010%'肯定是多余的,反而增加了分析判断和筛选的时间
[/Quote]

谢谢你的回复,第二种方法 加 like 可能是多余的。
但是第一种方法,你说的硬件及软件环境有关,即使是这种问题,速度应该很稳定,不是忽高忽低的吧,这也许说不过去。
为什么第一次查询就要3分钟左右,而以后查询大概在7秒左右呢。
hlf1989 2011-05-25
  • 打赏
  • 举报
回复
每一种情况感觉还是和机器的硬件以及软件环境有关,具体情况可以比较复杂,
需要楼主在尽量保证软硬件环境一致的情况下,找找原因

每二种情况,加Like '%010%'肯定是多余的,反而增加了分析判断和筛选的时间
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fredrickhu 的回复:]
第一个应该是缓存的问题
第二个题目如果有索引的话,第一条语句快,因为能利用到索引
%%这样的利用不到索引
[/Quote]

1.那缓存该怎样解决啊
2.索引是不就是那个ID,标识规范中 选择 是标识,这样就算索引了。?
--小F-- 2011-05-25
  • 打赏
  • 举报
回复
第一个应该是缓存的问题
第二个题目如果有索引的话,第一条语句快,因为能利用到索引
%%这样的利用不到索引
快溜 2011-05-25
  • 打赏
  • 举报
回复
感觉没区别,加Like '%010%',多此一举,跟1=1一样。
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ap0405140 的回复:]
先复制表结构,默认值: 在源表--右键--产生create table的代码--到目标库执行.
后复制表数据, Insert into Manager.dbo.MsgInfo select * from MsgInfo
[/Quote]

谢谢你,结贴了 。
唐诗三百首 2011-05-25
  • 打赏
  • 举报
回复
先复制表结构,默认值: 在源表--右键--产生create table的代码--到目标库执行.
后复制表数据, Insert into Manager.dbo.MsgInfo select * from MsgInfo
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ap0405140 的回复:]
1."B服务器上有的是否查询过一遍之后,速度就正常了.."
这是缓存的问题,执行第一遍时系统将数据读取到内存中,即是物理读(physical reads).后面就直接从内存读取数据,即是逻辑读(logical reads),速度就快很多了.

2.select * from Table where UserCode='010037' --直接查询出
select * from Tab……
[/Quote]

懂了 ,谢谢各位。

刚刚碰到个问题,我顺便问下:
我用select * into Manager.dbo.MsgInfo from MsgInfo --复制表数据及表结构,但是默认值是没有的。

有什么办法让两张表一模一样,默认值,字段类型,数据信息等。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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