导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

数据库中间遇到的 “大” 问题,高分请教,希望大家都来关照一下哦。

kiko_lee 2001-11-30 04:11:31
使用了是 SQL SERVER 7.0 用 VC 6.0 通过 ODBC 来连接。
使用数据库来存储一些日志信息,由于增长的速度很快。10个小时中间向一个表中间插入了160000条记录,而且日志的记录还是论月来计算的,所以需要解决大型数据库的手段。
我在查询中间的内容时,由于其中的数据量太大,我用的是CListCtrl来显示其中的内容。需要很长的时间才能查询出来,而且会由于延时过长而导致不能查询。我用了top 2000来显示最前面的2000个记录。
1、问题是如何查询第2001-4000个的记录,其意义就是如何实现查询的翻页。
有没有什么语句来实现。
2、我要求清空表中间的记录,使用了 delete top 2000 from tablename.
来实现,却被告知delete 不能使用 top 这个参数。因为要一次性删除100000条以上的日志还是会导致延时过长。

问题或许不是很复杂,但是我很少使用数据库,而且都是小规模的数据量的查询,这么大量的数据如何才能实现功能呢。

实在急用,分不够可以继续开贴增加。各位大哥多多帮助。
...全文
143 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
kiko_lee 2001-12-02
给分哦,多谢了。
回复
myand 2001-12-02
kiko_lee:
问题中的记录密度大概是4-5条记录/秒,是实时应用?。
本人做过实时应用项目。
1)数据库的设计要合理,尽量按类别分多个表存放
2)使用 clustered index
3)为避免transaction log过于庞大(SQL Server 6.5下会overflow),定期备份。
回复
AP 2001-12-01
那麽多的数据,用超级数据库吧
回复
seafo 2001-12-01
TRUNCATE 的用法
TRUNCATE TABLE authors
注意 TRUNCATE TABLE removes all rows from a table
注意是all rows !!!!!
回复
seafo 2001-12-01
修正一下:上面所说的第二个方法也可以这样实现
(设table1有id,姓名,部门,三个字段,id是唯一值)
create table #temp
(id int IDENTITY(1,1),
部门 varchar(10),
姓名 varchar(20)
)
insert into #temp select 部门,姓名 from [table1] order by 部门 desc
select * from #temp where id>1000 and id<2001
可实现按部门排序的翻页且效率高,不过#temp的id一定要是IDENTITY,且insert into的时候table1.id不能选
不知道 between 和 where id>1000 and id<2001哪个效率高,你可以实验一下
回复
kiko_lee 2001-12-01
呵呵,这个truncate怎么用呢?提示一下,以前没有见过这个东西。
回复
seafo 2001-12-01
1、可以用游标实现
declare @beginId int
declare @endId int
declare @sql varchar(255)
DECLARE cursor1 CURSOR FOR SELECT id FROM [table1] order by id
open cursor1
FETCH ABSOLUTE 1000 FROM cursor1 into @beginId
FETCH relative 1000 FROM cursor1 into @endId
set @sql='select * from [table1] where id between '+@beginId+' and '+@endId
exec(@sql)
如果 set @sql='delete from [table1] where id between '+@beginId+' and '+@endId就可以实现删除1000-2000的记录
坏处是只能按id排序
2、我上面一个帖子所说的方法
(设table1有id,部门,两个字段,id是唯一值)
select top 2000 * into #temp from [table1] order by 部门 desc,id desc
select top 1000 * from #temp order by 部门 asc,id asc
这样可以按部门排序并实现翻页效果,加上id是保证在部门大量重复的情况下仍能得出正确结果,显示的时候再按照(部门 desc,id desc)的顺序显示,缺点是到后面效率低,没有游标的效率高
回复
netyao 2001-12-01
删除一个表的记录:用truncate 比用delete 快多了,因为它不写事务日志。
回复
kiko_lee 2001-12-01
还有没有什么好的提示哦,要散分了。
回复
kiko_lee 2001-11-30
各位大哥,我可是要对 100000条以上的记录进行操作呢,多次的查询是不是太.......
回复
liu7537 2001-11-30
(1)选择1000-2000的记录
select * top 2000 from table1 where id not in
(select id top 1000 from table1 )
你可以使用集合操作符,首先查询出前2000条纪录,这是一个集合,在查询出前1000条纪录,这是第二个集合,然后两个集合相减即可.
这条我同意whodxaje(whodxaje)的观点.
(2)删除前20条纪录你可以使用cursor或者子查询.
使用子查询例子,如:delete from table1 where id in (select top 20 id from table1)
使用cursor例子,如:
declare
cursor c1 for
select top 20 id from table1 for update
begin
for rec1 in c1 loop
delete from table1 where current of c1;
end loop;


end;






回复
kiko_lee 2001-11-30
但是我的记录中间如果有的数据被删除了,那么这个INDEX就中断了。
何况我要查询前20000条的意思是为了提高效率,因为实在是可能会导致延时退出。
如果用whodxaje(whodxaje)的方法
select * top 2000 from table1 where id not in
(select id top 1000 from table1 )
执行两次SELECT 岂不是太浪费了?
还有没有什么好的办法呢。
回复
找以前的贴有讨论翻页的存储过程的!


如果要删除前20条记录,可以这样:
set rowcount 20
delete from tablename
set rowcount 0


回复
whodxaje 2001-11-30
你可以选择top 前2000条的但不是前1000条的记录
(1000-2000的记录)
select * top 2000 from table1 where id not in
(select id top 1000 from table1 )
我的思路是这样的,可能sql 不正确
回复
kiko_lee 2001-11-30
存储过程?那么vc如何调用存储过程呢。大家有个什么例子给我看看哦,我实在没有用过数据库。
回复
seafo 2001-11-30
我有一个翻页的存储过程
原理是使用order by asc Top200取出前200条记录放入临时表
再使用 top 100 + order by desc 取出101-200的记录
显示时再倒一下序就可以了
如果字段重复较多。可使用一个唯一字段一起排序
回复
kiko_lee 2001-11-30
呵呵,各位就没有一点建设性的意见?
回复
ILoveProgram 2001-11-30
关注And关注And关注And关注And关注
回复
sdsuper 2001-11-30
关注~~~!!!
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告