SQL查找为什么这么变态

luoqing 2005-07-12 08:34:24
我有一个表Order
对Order表建了两个索引ParentID,UserID
现在Order表有1千万条数据,
用Select * from ParentID=100只用了5s可以把数据查出来
用Select * from UserID=145 只用了4s可以数据查出来
但用Select * from ParentID=100 and UserID=145查,结果要了我5分钟

现在真是急啊,大位高手能帮我解释这是为什么???
...全文
146 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoqing 2005-07-13
  • 打赏
  • 举报
回复
由于这个数据库是USA与中国做了同步,我不知道如果我重新建索引会不会影响同步,但上面的内容是千真万确的,所以我说MS变态,如果是人为想的话,应该是先查一个,再查下一个,但执行计划显示两个索引同时查,合并花了98%的时间,真离普
phantomMan 2005-07-13
  • 打赏
  • 举报
回复
这是我产生的 50 万条记录,我在 bName 和 bAdrress 上建立的索引,查询某条记录:
select * from bigTable
where bNumber=26152 --bName='塻峚垃廑' and bAdrress='姎乪匽悥倱噓侕愎代嬂'

时间花费 0 秒,你可以试试:

CREATE TABLE bigTable(
bID int identity(1,1) primary key,
bName varchar(10),
bAdrress varchar(20),
bText varchar(100),
bNumber int,
bSum datetime
)
GO

--select NCHAR(19968)
--select NCHAR(40869)

select * from bigTable

declare @random_number int,@seed int, @i int, @j int
declare @random_Name varchar(10),@random_Adrress varchar(20),@random_Text varchar(100)
set @i = 0
set @seed=5
WHILE (@i < 500000)
BEGIN
select @random_Name='',@random_Adrress='', @random_Text=''
--首先产生长度为4个汉字的 bName
WHILE (@j < 4)
begin
select @random_number=5 * power(10,3) * rand() + 2 * power(10,4)
select @random_Name=@random_Name+NCHAR(cast(@random_number as int))
set @j =@j+1
end
--产生长度为20个汉字的 bName
set @j=0
WHILE (@j < 20)
begin
select @random_number=5 * power(10,3) * rand() + 2 * power(10,4)
select @random_Adrress=@random_Adrress+NCHAR(cast(@random_number as int))
set @j =@j+1
end
set @j=0
--产生长度为50个汉字的 bName
WHILE (@j < 99)
begin
select @random_number=5 * power(10,3) * rand() + 2 * power(10,4)
select @random_Text=@random_Text+NCHAR(cast(@random_number as int))
set @j =@j+1
end
set @j=0
--产生10000到99999的整数个汉字的 bName
SET @random_number=(power(10,@seed)-1-power(10,@seed-1))*rand()+power(10,@seed-1)

INSERT INTO bigTable VALUES(@random_Name,@random_Adrress,@random_Text,@random_number,getdate())
SET @i = @i + 1
END
bugchen888 2005-07-13
  • 打赏
  • 举报
回复
回复人: j9988(j9988) ( ) 信誉:313

正解,建联合索引,把选择性强的列放在前面.
云中客 2005-07-13
  • 打赏
  • 举报
回复
楼上的,太夸张了吧
phantomMan 2005-07-13
  • 打赏
  • 举报
回复
重新填充索引看看,我建立索引的一个50万条记录的查询只需要0秒,
lovcal 2005-07-12
  • 打赏
  • 举报
回复
学习,没有处理过这么多数据的问题
不过数据量特大的数据库,索引的维护是非常重要的
jixiaojie 2005-07-12
  • 打赏
  • 举报
回复
up
j9988 2005-07-12
  • 打赏
  • 举报
回复
删了两索引,

ParentID,UserID建联合主键.这样应该一1S以内就可查出.

另外:1KW的表,定时做索引维护是必须的.

34,593

社区成员

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

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