关于聚集索引

nanhaochen 2011-11-07 08:27:12
各位好:
现在小弟有个问题请教,我们有一个显示地图道路数据的软件,在地图上点击放大缩小时,地图道路会重绘,此时根据放大缩小,得到一个地图范围,然后根据这个范围去数据库中查询指定范围道路数据,然后显示在地图,在数据库中,因为道路表中加了空间索引,这个空间索引是聚集索引,显示速度还可以。现在需要加一个功能就是,希望放大,缩小地图时,不要再把指定范围内道路数据都从数据库中查询出来,因为以前软件都只是绘制某一个市的道路数据,现在一下子要绘制全国的数据,绘制的道路数据好多,所以现在希望的是,在放大缩小时,判断下当前比例尺是多大,根据这个比例尺范围,再判断该比例尺范围只绘制那些道路等级的道路数据,所以在原来查询的条件后加上了道路等级过滤条件,但是我想道路数据按道路等级分类应该会查询快些,因为有很多数据道路等级相同,我想比较适合建聚集索引,但是一个表中只能有一个聚集索引,如果我把空间索引和道路等级建成一个聚集索引,可以吗?谢谢
...全文
74 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nanhaochen 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chirea 的回复:]
引用楼主 nanhaochen 的回复:
判断下当前比例尺是多大,根据这个比例尺范围,再判断该比例尺范围只绘制那些道路等级的道路数据,所以在原来查询的条件后加上了道路等级过滤条件,但是我想道路数据按道路等级分类应该会查询快些,因为有很多数据道路等级相同,我想比较适合建聚集索引,但是一个表中只能有一个聚集索引,如果我把空间索引和道路等级建成一个聚集索引,可以吗?谢谢

直接对比例尺的范围进行重……
[/Quote]
刚开始加载的时全国的,点击放大时,可能当前显示范围包括几个省的,所以还是要根据道路等级过滤下,比如县级,村级的,就不显示,放大到县级,村级时才显示
禁用F3 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 nanhaochen 的回复:]
判断下当前比例尺是多大,根据这个比例尺范围,再判断该比例尺范围只绘制那些道路等级的道路数据,所以在原来查询的条件后加上了道路等级过滤条件,但是我想道路数据按道路等级分类应该会查询快些,因为有很多数据道路等级相同,我想比较适合建聚集索引,但是一个表中只能有一个聚集索引,如果我把空间索引和道路等级建成一个聚集索引,可以吗?谢谢
[/Quote]
直接对比例尺的范围进行重绘会不会好一些呢.如查询一个省的一个市,直接绘当前比例尺,而不全部绘.这样不但数据查询快,重绘也快一些吧
nanhaochen 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fredrickhu 的回复:]
SQL code
---使用索引优化数据库查询效率
1.不宜创建索引的情形
(1)经常插入,修改和删除的表
(2)数据量比较小的表,因为查询优化器在搜索索引时所花费的时间可能会大于遍历全表的数据所需要的时间

2.适合创建索引的情形
(1)为where子句中出现的列创建索引
(2)创建组合索引
(3)为group by 子句中出现的列创建索引

3.聚集索引的设计原则
(1……
[/Quote]
哦,对对,道路等级很多重复时,不适合建聚集索引,搞错了
--小F-- 2011-11-07
  • 打赏
  • 举报
回复
---使用索引优化数据库查询效率
1.不宜创建索引的情形
(1)经常插入,修改和删除的表
(2)数据量比较小的表,因为查询优化器在搜索索引时所花费的时间可能会大于遍历全表的数据所需要的时间

2.适合创建索引的情形
(1)为where子句中出现的列创建索引
(2)创建组合索引
(3)为group by 子句中出现的列创建索引

3.聚集索引的设计原则
(1)该列的数值是唯一的或者很少有重复的记录
(2)经常使用between ...and..按顺序查询的列
(3)定义identity的唯一列.
(4)经常用于对数据进行排序的列.

---无法使用索引的select语句
1.对索引列使用了函数,如:
select * from tb where max(id)=100

2.对索引列使用了'%xx',如:
select * from tb where id like '%1'
需要注意的不是所有使用like关键字的select 语句都无法使用索引,比如
select * from tb where id like '1%'就可以使用索引

3.在where子句中对列进行类型转换(其实也是使用到了函数)

4.在组合索引的第1列不是使用最多的列,如在下面3个查询语句中建立组合索引,按顺序包含col2,col1,id列;
select * from tb where id='1' and col1='aa'
select id,sum(col1) from tb group by id
select * from tb where id='2' and col2='bb'
则第一句和第二句无法使用到索引 所以需要注意组合索引的顺序

5.在where 子句中使用in关键字的某些句子
当在in关键字后面使用嵌套的select语句,将无法使用在该列上定义的索引
如:
select
*
from
ta
where
id
in
(select id from tb where ....)

--这样可以用到索引
select * from tb where id in('1','2')
Mr_Nice 2011-11-07
  • 打赏
  • 举报
回复
县级道路 5
...
市级道路 8
...
省级道路 10
...
高速路 20

如果分区的话,就找到对应的特征值 ——5——8——10——20——
——代表了一个区,区里面数据多少就看实际的使用状况了。

分区主要是缩小了索引搜索的范围,这样会带了效率的提升。每个区里面数据的多少,不影响分区的实施。但是分区的时候要考虑分出来最多数据量的分区的性能。
分区表相关参考

另外比例尺参数上,建议建立非聚集索引,这样也可以进一步提高效率。


-晴天 2011-11-07
  • 打赏
  • 举报
回复
不妥.
等级的数目必竟是很有限的.差别不大的列,本身就不适宜建聚集索引.特别是在你已经有一个列的时候,再将另一个列添加到聚集索引中,会使存储效率大大下降,如果还要经常添加数据的话,那后果是灾难性的.
nanhaochen 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 orchidcat 的回复:]
不建议这样使用,宽的关键字会是效率降低,而且存储的单位页里面,信息较少。会产生更多的页。
如果道路分级可以明确定义的话,简易lz可以使用分区表。
[/Quote]
是一个道路等级一个分区?,但是高等级的道路数据比低等级少好多,分区数据差很多,是否有影响?还有分区后,在根据比例尺判断显示道路等级后,在根据显示范围去各个分区表里找数据呢?我没用过分区,不知道是不是这样
Mr_Nice 2011-11-07
  • 打赏
  • 举报
回复
不建议这样使用,宽的关键字会是效率降低,而且存储的单位页里面,信息较少。会产生更多的页。
如果道路分级可以明确定义的话,简易lz可以使用分区表。
liangCK 2011-11-07
  • 打赏
  • 举报
回复
文字太长了,关注一下吧。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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