sql中读取270万条数据故居要8分钟,有没有比较快速的办法?

lvhao520121 2008-12-24 11:56:39
sql中读取270万条数据故居要8分钟,有没有比较快速的办法?
...全文
234 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
HDNGO 2008-12-24
  • 打赏
  • 举报
回复
读取是啥意思?全都读到内存?
  • 打赏
  • 举报
回复
如果你是要把200多万条数据全部查询回来,那没有办法,你可以算下需要多大的带宽才行,传输的内容至少有g以上吧,你在网路上传输g以上的文件看看要多长时间

如果是从这个数据量里检索数据,建立好索引,优化好数据库就可以了,绝不可能这么慢。
david_anwei 2008-12-24
  • 打赏
  • 举报
回复
数据库建立索引 查询是分页显示!
huangweizhi 2008-12-24
  • 打赏
  • 举报
回复
在这么多数据里面取数据确实会慢点,但8分钟是久了点,
楼主是不是用得太多的Order By 了,用了都会慢很多。
songhuan 2008-12-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ou108 的回复:]
楼猪有这么多数据吗?就算有,得把它显示出来吗?
我这么多年的工作经验还没见过,不过我知道一个地方有这么多数据,那就是移动的数据库。
[/Quote]

有这个数据量的很多滴,我们的数据库每周都有1000万的数据量


读取速度慢,还是要分页,如果确实业务逻辑不允许分页的话,就换SSD硬盘吧,能把你的速度提高很多倍
wangzhe1945 2008-12-24
  • 打赏
  • 举报
回复
索引是非常重要滴
ou108 2008-12-24
  • 打赏
  • 举报
回复
楼猪有这么多数据吗?就算有,得把它显示出来吗?
我这么多年的工作经验还没见过,不过我知道一个地方有这么多数据,那就是移动的数据库。
lwz1983 2008-12-24
  • 打赏
  • 举报
回复
建立索引

chang110cn 2008-12-24
  • 打赏
  • 举报
回复
为什么这么干?数据少点还行....
journeydj 2008-12-24
  • 打赏
  • 举报
回复
一次性查吗? 那速度还可以。
shuishixu 2008-12-24
  • 打赏
  • 举报
回复
CREATE Proc p_show
@QueryStr nvarchar(4000), --表名、视图名、查询语句
@PageSize int=10, --每页的大小(行数)
@PageCurrent int=1, --要显示的页
@FdShow nvarchar (4000)= ' ', --要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000)= ' ' --排序字段列表
as
set nocount on
declare @FdName nvarchar(250) --表中的主键或表、临时表中的标识列名
,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
,@Obj_ID int --对象ID
--表中有复合主键的处理
declare @strfd nvarchar(2000) --复合主键列表
,@strjoin nvarchar(4000) --连接字段
,@strwhere nvarchar(2000) --查询条件


select @Obj_ID=object_id(@QueryStr)
,@FdShow=case isnull(@FdShow, ' ') when ' ' then ' * ' else ' '+@FdShow end
,@FdOrder=case isnull(@FdOrder, ' ') when ' ' then ' ' else ' order by '+@FdOrder end
,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ( '+@QueryStr+ ') a ' end

--如果显示第一页,可以直接用top来完成
if @PageCurrent=1
begin
select @Id1=cast(@PageSize as varchar(20))
exec( 'select top '+@Id1+@FdShow+ ' from '+@QueryStr+@FdOrder)
return
end

--如果是表,则检查表中是否有标识更或主键
if @Obj_ID is not null and objectproperty(@Obj_ID, 'IsTable ')=1
begin
select @Id1=cast(@PageSize as varchar(20))
,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))

select @FdName=name from syscolumns where id=@Obj_ID and status=0x80
if @@rowcount=0 --如果表中无标识列,则检查表中是否有主键
begin
if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype= 'PK ')
goto lbusetemp --如果表中无主键,则用临时表处理

select @FdName=name from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype= 'PK ' and parent_obj=@Obj_ID
)))
if @@rowcount> 1 --检查表中的主键是否为复合主键
begin
select @strfd= ' ',@strjoin= ' ',@strwhere= ' '
select @strfd=@strfd+ ',[ '+name+ '] '
,@strjoin=@strjoin+ ' and a.[ '+name+ ']=b.[ '+name+ '] '
,@strwhere=@strwhere+ ' and b.[ '+name+ '] is null '
from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype= 'PK ' and parent_obj=@Obj_ID
)))
select @strfd=substring(@strfd,2,2000)
,@strjoin=substring(@strjoin,5,4000)
,@strwhere=substring(@strwhere,5,4000)
goto lbusepk
end
end
end
else
goto lbusetemp

/*--使用标识列或主键为单一字段的处理方法--*/
lbuseidentity:
exec( 'select top '+@Id1+@FdShow+ ' from '+@QueryStr
+ ' where '+@FdName+ ' not in(select top '
+@Id2+ ' '+@FdName+ ' from '+@QueryStr+@FdOrder
+ ') '+@FdOrder
)
return

/*--表中有复合主键的处理方法--*/
lbusepk:
exec( 'select '+@FdShow+ ' from(select top '+@Id1+ ' a.* from
(select top 100 percent * from '+@QueryStr+@FdOrder+ ') a
left join (select top '+@Id2+ ' '+@strfd+ '
from '+@QueryStr+@FdOrder+ ') b on '+@strjoin+ '
where '+@strwhere+ ') a '
)
return

/*--用临时表处理的方法--*/
lbusetemp:
select @FdName= '[ID_ '+cast(newid() as varchar(40))+ '] '
,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))

exec( 'select '+@FdName+ '=identity(int,0,1), '+@FdShow+ '
into #tb from(select top 100 percent * from '+@QueryStr+@FdOrder+ ')a
select '+@FdShow+ ' from #tb where '+@FdName+ ' between '
+@Id1+ ' and '+@Id2
)
GO
niitnanfeng 2008-12-24
  • 打赏
  • 举报
回复
索引,分页
lvfeng19806001 2008-12-24
  • 打赏
  • 举报
回复
2楼
Zhanlixin 2008-12-24
  • 打赏
  • 举报
回复
1.根据查询条件建立索引
2.建立分页
yzbsd 2008-12-24
  • 打赏
  • 举报
回复
如果在数据库中查询要8分钟的话就应该是你sql语句的问题了,如果在程序中需要8分钟就需要分页查询了
jefflovejava 2008-12-24
  • 打赏
  • 举报
回复
为了显示的话,最好做分页处理;
写文件的话,也要分页,我想你写文件的缓存应该也不会给你那么大吧。

当然分页后,全部读取玩之后肯定会比你一次全部读取还要慢,但是重点在于操作性和用户体验方面
fuyuxin19801120 2008-12-24
  • 打赏
  • 举报
回复
建立索引 存储过程
david_anwei 2008-12-24
  • 打赏
  • 举报
回复
你获取的数据项多吗?如果获取的数据列不是很多的话不至于这么慢!SQL语句优化获取有用的数据项!
wangkun9999 2008-12-24
  • 打赏
  • 举报
回复
不用数据库,用lucene索引
JustLovePro 2008-12-24
  • 打赏
  • 举报
回复
hehe
up

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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