毫秒级的SQL查询应用,急!

gege45 2007-03-20 07:01:33
在做的一个项目中,
所有的操作都是毫秒为计算单位的
要求尽快地完成一次SQL查询

这个查询是非常简单的,
就是用一个关键词(字符型)去查询一个表(有上万条记录)
返回的查询结果,
只要能够知道这个表里面有没有这条记录就可以了
(即知道真,假定就可以了,不需要使用返回的记录)

除了建立索引之外,还有没有其他的优化方法,如何做??谢谢

目前,我是用的VC+ADO,用Connection 对象的 Execute 方法查询,将返回结果赋给Recordset,然后看Recordset对象是否EOF.
我的问题是
1 如何设置Connection,Recordset的参数才会效率更高?或者有其他执行效率更高的方法?
2 就VC而言,这种只需要知道查询结果真假的SQL查询,应该怎么写效率最高?
...全文
588 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
plphoenix 2007-05-30
  • 打赏
  • 举报
回复
select XXX from table where XXX=1
union select XXX from table where XXX=2
union .....
fantiyu_sr 2007-04-02
  • 打赏
  • 举报
回复
如果需要毫秒极查询,建议你初始化的时候把整个表读入内存建立字典,然后在使用过程中动态维护字典,程序结束再更新数据库或者用后台线程慢速维护数据库。
这样是最快的方案
ok1234567 2007-03-31
  • 打赏
  • 举报
回复
如果你用vc以服务器的方式提供服务,最快的方式是在服务器程序中直接维护一个键索引,这样就免去了与数据库沟通的开销
ok1234567 2007-03-31
  • 打赏
  • 举报
回复
可以通过查询计划查看你的查询执行成本,判断那种语句更优

如果增加数据结构的复杂度
可以考虑一定的语句冗余--单独建一张key表,一字段主索引,也许会有一定的性能提高
ok1234567 2007-03-31
  • 打赏
  • 举报
回复
在查询上,我觉得你的判断EOF在ADO方式下应该是很快的,
查询语句应该这样写:SELECT top 1 1 FROM mytable where ckey='XXXX'
注意是"top 1 1", 两个1,相当于exists

如果要一次判断多个词,可以这样写:
SELECT top 1 1 FROM mytable where ckey in ('XXXX','xxx','yyy'...)
bluelu 2007-03-31
  • 打赏
  • 举报
回复
plphoenix() :建议你用union把多条select语句一次组成一条然后传到服务器去执行.再得到这些结果,虽然代码要多写点,但是带来的效率绝对值得的.
这种方法如何实现????
ringphone 2007-03-30
  • 打赏
  • 举报
回复
不用存储过程,查询语句也可以实现:
select res=case when exists(select top 1 ckey from my_table WHERE ckey='ckey') then 1 else 0 end
taianmonkey 2007-03-30
  • 打赏
  • 举报
回复
写个触发器来处理
ok1234567 2007-03-25
  • 打赏
  • 举报
回复
存储过程应该是这样:

CREATE PROCEDURE [cp_query_key]
@ckey varchar(30)
AS
IF EXISTS(SELECT 1 FROM my_table WHERE ckey=@ckey) RETURN 1
RETURN 0
ok1234567 2007-03-25
  • 打赏
  • 举报
回复
快速的方法可能是
1\通过存储过程(exists)返回值(整形)判断
2\使用ODBC API(SQLBindParameter),不要使用封装类或者组件
3\使用数据库连接池,不要每次都去建立连接
gege45 2007-03-24
  • 打赏
  • 举报
回复
多谢各位的建议
plphoenix 2007-03-22
  • 打赏
  • 举报
回复
如果只是上万条数据,这个随便做做应该都没有问题的.10w条数据以内的表从oracle到access基本上速度没有什么区别.
按照我以前的经验,100w的表,一次update20多个字段,可以一秒钟执行40条(当然也得看硬件).你1w多的数据select1条的话我想快N多倍的.
不过有几点建议:1.这是最重要的一条,尽量不要把select语句一条条的去执行.因为每次数据库都要重建网络连接,编译一下,然后再返回数据.这个效率非常低,我前面说的一秒能更新40多条,如果用这种方式去更新的话一秒就最多5条.几乎10倍的差别.建议你用union把多条select语句一次组成一条然后传到服务器去执行.再得到这些结果,虽然代码要多写点,但是带来的效率绝对值得的.
2.用exist可以更快的得到执行结果,这个没什么好说的吧.
3.用索引,当然是把你的关键词建一个索引了.
其它要是你还不满足的话,可以去看看你用的数据库的优化方面的书了.缓存,存储,临时表,负载...无止境的
yeah920 2007-03-22
  • 打赏
  • 举报
回复
chehw(chehw) ( ) 信誉:110 Blog 2007-3-20 22:03:15 得分: 0



1、如果考虑性能,应直接用ODBC或OLEDB
2、SELECT count(*) from table where (field_a='key') order by field_a




--------------------
对于第2点,查询比较慢!!
尘雨 2007-03-22
  • 打赏
  • 举报
回复
写个存储过程
if exist(select top 1 id from test where id=?)
chehw 2007-03-20
  • 打赏
  • 举报
回复
1、如果考虑性能,应直接用ODBC或OLEDB
2、SELECT count(*) from table where (field_a='key') order by field_a
Yao-debo 2007-03-20
  • 打赏
  • 举报
回复
很多人都有遇到这样的问题,查询速度是一方面,显示出来也是需要注意的。如果控件用的不好,很容易出现把时间浪费在显示数据上的情况
xyxfly 2007-03-20
  • 打赏
  • 举报
回复
这个我觉得应该从数据库入手吧?
windbells 2007-03-20
  • 打赏
  • 举报
回复
select top 1 ... f

4,018

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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