web-dev-qa-db-fra.com

Comment configurer la solution pour la recherche de distance multidimensionnelle avec les types de données spatiales SQL Server

J'ai une solution de base de données existante qui ne fonctionne pas très bien. Je cherche des données multidimensionnelles avec une structure de table traditionnelle utilisant des flotteurs, etc. La base de données contient ~ 1-2M lignes.

Après une recherche, j'ai rencontré les types de données spatiales SQL Server où vous pouvez définir une géométrie basée sur le point ou le multipoint où vous pouvez rechercher une distance de distance. Je pense que cela pourrait être une solution, mais j'ai besoin d'aide pour commencer dans la bonne direction.

Ma structure de table actuelle est la suivante où chaque ligne contient 2 valeurs (finalement) XYZ:

    | ID | X1  | Y1  | Z1  | X2  | Y2  | Z2  |
    | 1  | 1.1 | 2.2 | 5.1 | 1.2 | 2.1 | 4.1 |
    | 2  | 3.2 | 5.1 | 4.1 | 3.2 | 3.1 | 3.1 |
    | 3  | 4.1 | 2.3 | 6.3 | 4.2 | 4.1 | 2.1 |
    | 4  | 2.4 | 3.5 | 2.1 | 3.2 | 2.1 | 4.1 |

Je pratique la recherche avec une tolérance pour chaque valeur X, Y et Z.

Donc, par exemple:

    (pseudocode)
    declare targetXYZ1 = (4.1, 2.2, 3.1);
    declare targetXYZ2 = (2.8, 2.2, 4.2);

    declare toleranceXYZ = (2,2,2)

    Select ID from MyXYZTable tb
    Where 
           Math.Abs(tb.X1 - targetXYZ1.X1) < toleranceXYZ.X 
       AND Math.Abs(tb.Y1 - targetXYZ1.Y1) < toleranceXYZ.Y
       AND Math.Abs(tb.Z1 - targetXYZ1.Z1) < toleranceXYZ.Z

       AND Math.Abs(tb.X2 - targetXYZ1.X2) < toleranceXYZ.X 
       AND Math.Abs(tb.Y2 - targetXYZ1.Y2) < toleranceXYZ.Y
       AND Math.Abs(tb.Z2 - targetXYZ1.Z2) < toleranceXYZ.Z

Après une analyse, je devrais probablement créer une table avec 1 ou 2 colonnes de géométrie pour XYZ1 et XYZ2 avec géométrie :: point 0, 0, 0)

Mes questions:

  1. Y a-t-il une solution possible avec les types spatiaux SQL Server?
  2. Dois-je utiliser la recherche voisine la plus proche ou puis-je utiliser STDISTANCE?
  3. Dois-je installer un index spatial pour la table?

Tout conseil ou astuces et astuces sont les bienvenus!

7
wilkokosten

En tant que note latérale, Postgis prend en charge 3D-Cordinates et Srids (quel serveur SQL ne fonctionne pas). Voir st_3distance . Et cela fera un knn sur un index 3D en utilisant le <<->> opérateur et st_3dddithin

SELECT *
FROM tbl_Foo AS t
WHERE ST_3DDWithin( t.3dgeom, mycord, distance_in_meters );
  ORDER BY t.3dgeom <<->> mycord;

^ Trouve et l'ordonne sur un index.

0
Evan Carroll