这样的查询怎样提升效率?????

cannel 2009-05-08 11:23:55
环境是VS2005,一个小功能用Access数据库作临时表

此功能的其中一部分是对表A进行查询,表A的关键字段有X1,Y1,X2,Y2,这4个字段代表了一条线段的两个端点的坐标值,其中X1一定大于X2

这个查询功能中,表A有N行就要进行约N次查询,比如说我的实验数据有1200万行,就要进行约1200万次查询,所以我想此功能的耗时是跟行数的平方成正比

表A已对X1,X2字段分别建立索引

请问还有什么方法提高效率
...全文
58 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cannel 2009-05-08
  • 打赏
  • 举报
回复

我试过对(X1,X2)建立索引,实验感觉还是X1,X2两个字段分别独自建立索引比较快,weight字段一般只有两三种值,这个应该影响不大吧

这表中X1比X2小,在where X2 > " + XMIN + " And X1 < " + XMAX 中,XMIN是点的X值减去半径,XMAX是加上半径,这样搜索后再对每一条搜出来的线计算与点的距离
ACMAIN_CHM 2009-05-08
  • 打赏
  • 举报
回复

从数据库的角度来说,基于你的查询语句,应建议索引(X1,X2)或如果符合条件很多则(X1,X2,Weight)

这个功能是查询某点在一定半径的圆的范围内所有经过的线段
好象不是这个算法啊。是应该算这条直接到圆心的距离。

另外这个临时表的生存期是多少?不否可以考虑用数据文件代替?比如直接的随机文件的读取速度比较快。
cannel 2009-05-08
  • 打赏
  • 举报
回复
查询语句是这个"select * from LineCollection where X2 > " + XMIN + " And X1 < " + XMAX + " order by Weight";

这个功能是查询某点在一定半径的圆的范围内所有经过的线段

这个功能的数据本原是多边形或多段的线段,把所有的点提取出来形成点表,把所有的线段提取出来形成线表,我上边提到的查询就是从点表中逐个提取并对线表进行查询



ACMAIN_CHM 2009-05-08
  • 打赏
  • 举报
回复

你具体的查询功能是什么?

要根据你实际的查询情况来设置索引,或者需要多个索引。然后还要确定哪些功能由数据库来完成,哪些有你的程序来完成。

如果这表中的 1200万 都要用,又没什么复杂的数据库操作,这样你用临时表,还不如直接用TXT/XML文件。

方案很多,看具体你的具体应用才能找出平衡的方法。

WWWWA 2009-05-08
  • 打赏
  • 举报
回复
贴数据吧,直观一些
ACMAIN_CHM 2009-05-08
  • 打赏
  • 举报
回复

由于你的X2与X1没什么关系,是应该只建一个索引就可以了。这个查询中也只会用到一个索引。

其实我不是觉得,直接生成一个按X1排好序的顺序文件效率比较好。

1200万行(double x1,x2,y1,y2,weight) = 12 M * (8 byte*5) = 480 MB 。用ACCESS远不如直接用文件IO来访问的快。找一记录你只要log2(12M)= 27 次也就找到X1位置了。然后顺序读到底。

ACCESS数据库不过是把这个文件访问包装起来了。当然也会有一些开销。
ACMAIN_CHM 2009-05-08
  • 打赏
  • 举报
回复

ACCESS对语句的优化不是太强。

where X2 > " + XMIN + " And X1 < " + XMAX
那建议用(X2,X1)索引,或者改你的where X2 > " + XMIN + " And X1 < " + XMAX 中的顺序。

7,712

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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