关于关联表的问题

jacobsan 2006-12-22 01:31:07
假设有两张表,表1存放将某个区域分为小格的信息,字段x1,y1,x2,y2分别表示小格的最小和最大坐标;
表2存放很多经纬度信息;
先要求,将表2中的的数据与表1关联,即查询每个经纬度所属的小格ID(每个小格覆盖的区域不重复,因此每个经纬度信息对应一个小格ID)
详细的请看以下具体数据

--测试数据

create table t1(id int identity(1,1),name varchar(100),x1 numeric(9,3),y1 numeric(9,3),x2 numeric(9,3),y2 numeric(9,3))
go

declare @cntx int
declare @cnty int
set @cntx=0
set @cnty=0

--插入小格信息
while(@cntx<1000)
begin
set @cnty=0
while(@cnty<1000)
begin
insert into t1(name,x1,y1,x2,y2) values(left(newid(),5),@cntx*3,@cnty*3,@cntx*3+2.999,@cnty*3+2.999)
set @cnty=@cnty+1
end

set @cntx=@cntx+1
end
go


create table t2(area_id int identity(1,1),logi numeric(9,3),lat numeric(9,3))
go

--随机插入经纬度信息
declare @cntx int
set @cntx=0
while(@cntx<5000)
begin
insert into t2(logi,lat) values(abs(checksum(newid()))%3000,abs(checksum(newid()))%3000)

set @cntx=@cntx+1
end
go

--删除测试表
drop table t1
drop table t2



--我进行关联的方法
select * from t1 inner join t2 on logi between x1 and x2 and lat between y1 and y2



有没有更好更快的方法可以使用?
在相关字段建立索引可以提高查询的速度
现求更好的方法,或好的索引建立方案
请将方法和实现的效果、效率一并给出,谢谢
...全文
438 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2006-12-28
  • 打赏
  • 举报
回复
棒场
jacobsan 2006-12-28
  • 打赏
  • 举报
回复
。。。继续放段时间。。。
冷箫轻笛 2006-12-27
  • 打赏
  • 举报
回复
想了想,没有想出更好的思路或者算法来。。。

-_-!
jacobsan 2006-12-26
  • 打赏
  • 举报
回复
up一下
jacobsan 2006-12-22
  • 打赏
  • 举报
回复
最后up一下,周一来看有没有答案
三下鱼 2006-12-22
  • 打赏
  • 举报
回复
太深奥了,看不懂哦!
jacobsan 2006-12-22
  • 打赏
  • 举报
回复
pengda1i(冒牌大力 V0.4) ( ) 信誉:100 Blog 2006-12-22 14:38:53 得分: 0


5000行也先建索引测试,索引多对性能的影响在后面才考虑



----
恩,有没有更好的索引建立方案?或是其他的查询方法?
jacobsan 2006-12-22
  • 打赏
  • 举报
回复
不是电脑的原因,我将执行正常的电脑上的文件copy到不正常的电脑上,也可以正常执行
那个电脑上不知道谁装的什么版本。。汗自己。。方法比较粗鲁。。
pengda1i 2006-12-22
  • 打赏
  • 举报
回复
5000行也先建索引测试,索引多对性能的影响在后面才考虑
pengda1i 2006-12-22
  • 打赏
  • 举报
回复
说一个奇怪的现象,这样的结构和查询,当数据量达到一定程度,在某些2000的版本上查询速度会非常慢,而某些版本正常

---
不同电闹配置不同,达到瓶颈的数据量也不同,到了瓶颈就很慢很慢了

jacobsan 2006-12-22
  • 打赏
  • 举报
回复
说一个奇怪的现象,这样的结构和查询,当数据量达到一定程度,在某些2000的版本上查询速度会非常慢,而某些版本正常
marco08 2006-12-22
  • 打赏
  • 举报
回复
我試過用exists,效果不理想
jacobsan 2006-12-22
  • 打赏
  • 举报
回复
目前效率最高的是将簇集索引建到t1(x1,y1,x2,y2)上,但效果还是不满意
jacobsan 2006-12-22
  • 打赏
  • 举报
回复
这里t1 100W,t2 5000行,我是希望这样的小数据量能缩减到1秒左右
谢谢冒牌了~~~~
jacobsan 2006-12-22
  • 打赏
  • 举报
回复
我发现两张表都建索引会降低效率
create index ind_t1 on t1(x1,y1,x2,y2)
go

单单建这个会有提高,大概缩减到10s左右
但是实际数据量更大,再想想,呵呵
CSDMN 2006-12-22
  • 打赏
  • 举报
回复
查询是没得改的了
只有考虑索引

create index ind_t1 on t1(x1,y1,x2,y2)
go

create index ind_t2 on t2(logi,lat )
go



jacobsan 2006-12-22
  • 打赏
  • 举报
回复
貌似分数给少了。。。各位大大抱着研究的态度想想把,嘿
jacobsan 2006-12-22
  • 打赏
  • 举报
回复
两个ID没有关系,完全通过经纬度关联
caixia615 2006-12-22
  • 打赏
  • 举报
回复
select * from t1 a, t2 b where a.x1<b.logi<a.x2 and a.y1<b.lat<a.y2 and a.id=b.area_id
jacobsan 2006-12-22
  • 打赏
  • 举报
回复
大家帮忙考虑一下,谢谢!
加载更多回复(2)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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