一个常见问题,大家是怎么解决的??---急(200分)

  • 主题发起人 主题发起人 xxhsh
  • 开始时间 开始时间
X

xxhsh

Unregistered / Unconfirmed
GUEST, unregistred user!
一个有1,2百万 记录的数据库表,
用sql查询,返回的记录有100条左右的话,一般需要多少时间??
有什么方法可以优化嘛?
在服务器端,用存储过程,查询速度可以得到提升嘛???
关于这100条返回的记录如何分页显示????
 
1。“一个有1,2百万 记录的数据库表,
用sql查询,返回的记录有100条左右的话,一般需要多少时间??”
这要看你用的DBMS了,我们公司做过一个电信系统,后台数据库用的Informix,数据库
表中记录是亿级的,可是一个优化良好的SQL查询也只是几秒钟的时间;可是你如果用
Access,比如DFW的离线数据库,一个简单的查询也不止这个时间了。其他的数据库没有具体
用过,没有发言权;
2。“有什么方法可以优化嘛?‘
关于SQL语句优化的方法,可以参考一些数据库基础教程,一般都会给出一些方法论的
指导,实际工作中熟悉这些方法论比学习具体的某一种优化方法更重要。
3。“在服务器端,用存储过程,查询速度可以得到提升嘛???“
这几乎是肯定的,如果你的存储过程写的不是效率太低的话!
4。”关于这100条返回的记录如何分页显示????“
这要看你打算在什么容器里显示了。如果你想在StringGrid或者ListBox里显示,那么
你可以自己在代码里动态从查询得到的数据集里分段抽取数据来显示;如果想直接在DBGrid
里分页显示,就要考虑一下SQL语句的写法以及Delphi的控制了。

 
1、建索引了
2、要看具体情况而定,不好说,
3、存储过程并不能明显提高数据库的效率,
4、在Oracle中:(以取90~100的记录为例)
Select * from
(select rownum rrr,t1 from table1)
where rrr between 90 and 100
在Sql Server中:
 Select top 100 * from table1 Where t1 not in
(Select top 90 * from table1)
 
用ado的分页
 
to rainxy2002

如果在oracle中,查讯是按某种顺序进行,如order by xxx
那样的话,再用 你讲的分页,就没有作用了。这样怎么办??
 
一样啊!
Select * from
(select rownum rrr,t1 from table1 order by t1)
where rrr between 90 and 100
 
to rainxy2002

不对吧!? oracle的子查询是不能带order by 的呀,这样的语句你测试过吗?
oracle中的order by 是对查出的记录进行的排序,也就是说,它只能作用在最外边
一层。
 
呵呵,分页的问题在mysql中特别好解决。
select * from tablename limit beginrecno,recnum
从beginrecno开始,取出recnum条记录
 
Walone:
不知那个缺德的和你说子查询不能带Order by,你自己为什么不测试一下?
我公司开发分页都用这种方法。
Select * from
(select rownum rrr,tname from tab order by tname)
where rrr between 90 and 100
测测吧,不能全靠别人
 
一个苯办法:) ,用 DBGrid 也可以
---------------------------------------------------------
表加一个 ID ,Int ,标识自增

var

i : Integer ; //全局

FormCreate : i := 0 ;

procedure TForm1.Button1Click(Sender: TObject); //打开 ,每次显示 10 条记录
begin
with ADOQuery1 do
begin
Close ;
Sql.Text := 'select * from zhang_cpkkc where Id > ' + IntToStr(10*i)
+ ' and id < ' + IntToStr(10*i + 11) ;
Open ;
First ;
end;
i := i + 1 ;

if TButton(Sender) = Button1 then Button1.Enabled := False ;

end;

procedure TForm1.Button2Click(Sender: TObject);//下一页
begin
Button1Click(Button1) ;
end;
 
提高速度,就是建立索引和用好索引。
所以你在写前段程序时要注意充分利用到索引
(当然你建表的顺序。
select子句和where子句,order by后的字段也要注意用到索引)

Oracle的分页rainxy2002说的很好
可是在Sql Server中:
我完成反对
想想,如果你查询分页到最后一页时不是做了两次查询,
而且是大数据量的,那分页还有什么意义?
可是在Sql Server中:自己定义一个id,然后用一个分区函数专门计算页数
 
SELECT * FROM table WHERE ROWNUM<101;

minus

SELECT * FROM table WHERE ROWNUM<91;
ORACLE自动分页(因为ORACLE不支持TOP语法,而ROWNUM>100这样的条件也不支持)
 
后退
顶部