zoukankan      html  css  js  c++  java
  • SpatiaLite空间索引(一)

    SpatiaLite空间索引(一)

                                                --SpatiaLite的入门手册翻译   Baldwin.Xue整理

    原英文网址: http://www.gaia-gis.it/gaia-sins/spatialite-tutorial-2.3.1.html#mbr_cache

    阅读SpatiaLite的入门手册第8节总结得到:

    1: v.3.6.0 SQLite 以后的版本对RTree索引有稳定的实现

    2:元数据表geometry_columns 中的spatial_index_enabled字段用了和一张数据表中的空间数据是否建立了控件索引并且可用。

    3:SQLite RTree使用SQLite的VIRTUAL TABLE的方式实现的,一个RTree用四张表实现

    • prefix (前缀)
    • prefix_node
    • prefix_parent
    • prefix_rowid

    4:SpatiaLite为了确保进入到主表中和主表关联的空间索引表的控件对象的高度一致建立了三个triggers(出发器)

    5:你每次从主表中INSERT、UPDATE、DELETE一行数据你可以保证相应的索引信息也已经正确的更新了,因为活动的triggers会使这样约定生效。

    6如下不适用空间索引的按空间范围查询

    SELECT tablename FROM fieldname
               WHERE X(
    geom) > 730000 AND X(geom) < 734000
               AND Y(
    geom) > 4810000 AND Y(geom) < 4850000;

    如下是使用空间索引的按空间范围查询

    SELECT tablename FROM fieldname WHERE ROWID IN
               (SELECT
    pkid FROM idx_ tablename_geom WHERE
                xmin > 730000 AND xmax < 734000 AND ymin > 4810000 AND ymax < 4850000);

    注意:这两种查询在数据条数少的时候性能区分是不明显的,当时如果数据量比较大(如上数据达到MILLION级)的时候速度回又几分钟变成几秒钟。

    7删除空间索引的步骤

          SELECT DisableSpatialIndex('NewTowns', 'geom');

    DROP TABLE idx_NewTowns_geom;

    VACUUM;

    第一步调用DisableSpatialIndex这样来移除trigger以此来停止空间索引的更新。第二步,因为第一步并不会删除RTree自身所以要显示的调用DROP TABLE以在物理层面上把索引表删除掉。第三步,最好调用一下VACUUM,用以维护数据库的高效状态。

    (经过这三步的操作只是把索引和出发器删除了,而元数据表geometry_column中的相应的数据却没有删除掉,如果要删除的话需要显示的调用SQL语句来删除这些数据)

  • 相关阅读:
    kettle用户手册(7:变量)
    kettle用户手册(3:创建一个数据库链接)
    PDI的steps:(4:Add sequence)
    kettle用户手册(2:创建一个转换或者job)
    vmware vsphere 5虚拟数据中心构建指南(一)
    PDI的step:(1:abort)
    MongoDB在CentOS下的安装(二次修改)
    Cent OS 5.6下安装MongoDB教程
    CentOS5.6安装DNS的Bind服务器
    芒果知识补充(1)mongodb 单机的备份与恢复
  • 原文地址:https://www.cnblogs.com/xueye9/p/2400040.html
Copyright © 2011-2022 走看看