Pour la mise en place d'un système de géolocalisation sous FirebirdSQL via les données de IPLIGENCE vous avez besoins d'une table dont la structure est représenté ci-dessous :

 

    1:  CREATE TABLE MP_IPLIGENCEMAX (
    2:    IP_FROM NUMERIC(11, 0) NOT NULL,
    3:    IP_TO NUMERIC(11, 0) NOT NULL,
    4:    COUNTRY_CODE VARCHAR(10),
    5:    COUNTRY_NAME VARCHAR(255),
    6:    CONTINENT_CODE VARCHAR(10),
    7:    CONTINENT_NAME VARCHAR(255),
    8:    TIME_ZONE VARCHAR(10),
    9:    REGION_CODE VARCHAR(10),
   10:    REGION_NAME VARCHAR(255),
   11:    OWNER VARCHAR(255),
   12:    CITY_NAME VARCHAR(255),
   13:    COUNTY_NAME VARCHAR(255),
   14:    LATITUDE FLOAT,
   15:    LONGITUDE FLOAT);
   16:   
   17:   
   18:  CREATE INDEX IDX_MP_IPLIGENCEMAX ON MP_IPLIGENCEMAX(IP_FROM);
   19:   
   20:  CREATE INDEX IDX_MP_IPLIGENCEMAX1 ON MP_IPLIGENCEMAX(IP_TO);
   21:   
   22:  CREATE INDEX IDX_MP_IPLIGENCEMAX2 ON MP_IPLIGENCEMAX(COUNTRY_CODE);
   23:   
   24:  CREATE INDEX IDX_MP_IPLIGENCEMAX3 ON MP_IPLIGENCEMAX(CONTINENT_CODE);
   25:   
   26:  CREATE INDEX IDX_MP_IPLIGENCEMAX4 ON MP_IPLIGENCEMAX(IP_FROM,IP_TO);

 

et pour ne pas perdre une journée à attendre que les deux millions d'enregistrements s'importent à leurs aise, je vous conseille de créer un table externe comme ci-dessous:

 

    1:  CREATE TABLE EXT_IPLIGENCE6 EXTERNAL '/fbdatas/ipligence-max.txt' (
    2:    IP_FROM CHAR(11),
    3:    IP_TO CHAR(11),
    4:    COUNTRY_CODE CHAR(10),
    5:    COUNTRY_NAME CHAR(255),
    6:    CONTINENT_CODE CHAR(10),
    7:    CONTINENT_NAME CHAR(255),
    8:    TIME_ZONE CHAR(10),
    9:    REGION_CODE CHAR(10),
   10:    REGION_NAME CHAR(255),
   11:    OWNER CHAR(255),
   12:    CITY_NAME CHAR(255),
   13:    COUNTY_NAME CHAR(255),
   14:    LATITUDE CHAR(18),
   15:    LONGITUDE CHAR(18),
   16:    CTRL CHAR(2));

 

ensuite l'insertion ne prends que moins de cinq minutes via la requête suivant :

 

    1:  insert into MP_IPLIGENCEMAX
    2:  SELECT
    3:   cast(trim(IP_FROM) as numeric(11)),
    4:   cast(trim(IP_TO) as numeric(11)),
    5:   trim(COUNTRY_CODE),
    6:   trim(COUNTRY_NAME),
    7:   trim(CONTINENT_CODE),
    8:   trim(CONTINENT_NAME),
    9:   trim(TIME_ZONE),
   10:   trim(REGION_CODE),
   11:   trim(REGION_NAME),
   12:   trim(OWNER),
   13:   trim(CITY_NAME),
   14:   trim(COUNTY_NAME),
   15:   cast(trim(LATITUDE) as float),
   16:   cast(trim(LONGITUDE) as float)
   17:   from EXT_IPLIGENCE6

 

ensuite, pour tester si tout est correct vous pouvez effectuer la requête suivante :

    1:  SELECT *
    2:   FROM MP_IPLIGENCEMAX
    3:   WHERE 
    4:      fnIPTOLONGIP('217.112.189.18') between IP_FROM and IP_TO

 

 

IP_FROM IP_TO COUNTRY_CODE COUNTRY_NAME CONTINENT_CODE CONTINENT_NAME TIME_ZONE REGION_CODE REGION_NAME OWNER CITY_NAME COUNTY_NAME LATITUDE LONGITUDE
3648043264 3648044543 BE BELGIUM EU EUROPE GMT+1     BELCENTER ADSL NETWORK BRUSSELS   50,83000183 4,329999924

 

Plan:
PLAN (MP_IPLIGENCEMAX INDEX (IDX_MP_IPLIGENCEMAX1, IDX_MP_IPLIGENCEMAX))
Adapted plan:
PLAN (MP_IPLIGENCEMAX INDEX (IDX_MP_IPLIGENCEMAX1, IDX_MP_IPLIGENCEMAX))

------ QUERY PERFORMANCE ------
Prepare               : 15 ms
Execute               : 15 ms
Avg fetch time : 85 ms

----------- MEMORY ------------
Current       : 22,27 MB
Max              : 35,36 MB
Buffers        : 2048

------ TABLE OPERATIONS -------
Table name      : MP_IPLIGENCEMAX
Idx reads           : 1
Non-idx reads : 0
Updates             : 0
Deletes              : 0
Inserts                : 0

View User Profile for Norbert Saint Georges
Envoié par Norbert Saint Georges dimanche 2 février 2014 15:34:00 Categories: FirebirdSQL
Tetrasys Oy
Évaluer ce contenu Voix 0

Commentaires

Les commentaires sont fermés pour ce message.