Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изчисляване на разстояние с огромна база данни на SQL Server

Можете да направите по-лошо от това да погледнете GEOGRAPHY тип данни, например:

CREATE TABLE Places
(
    SeqID       INT IDENTITY(1,1),
    Place       NVARCHAR(20),
    Location    GEOGRAPHY
)
GO
INSERT INTO Places (Place, Location) VALUES ('Coventry', geography::Point(52.4167, -1.55, 4326))
INSERT INTO Places (Place, Location) VALUES ('Sheffield', geography::Point(53.3667, -1.5, 4326))
INSERT INTO Places (Place, Location) VALUES ('Penzance', geography::Point(50.1214, -5.5347, 4326))
INSERT INTO Places (Place, Location) VALUES ('Brentwood', geography::Point(52.6208, 0.3033, 4326))
INSERT INTO Places (Place, Location) VALUES ('Inverness', geography::Point(57.4760, -4.2254, 4326))
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
    FROM Places p1
    CROSS JOIN Places p2
GO  
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
    FROM Places p1
        INNER JOIN Places p2 ON p1.SeqID > p2.SeqID
GO  

geography::Point взема географската ширина и дължина, както и SRID (специален референтен идентификационен номер). В този случай SRID е 4326, което е стандартна ширина и дължина. Тъй като вече имате географска ширина и дължина, можете просто да ALTER TABLE за да добавите географската колона, след това UPDATE за да го попълните.

Показах два начина за извличане на данните от таблицата, но не можете да създадете индексиран изглед с това (индексираните изгледи не могат да имат самообединяване). Бихте могли обаче да създадете вторична таблица, която на практика е кеш, който се попълва въз основа на горното. След това просто трябва да се тревожите за поддържането му (може да се направи чрез тригери или някакъв друг процес).

Обърнете внимание, че кръстосаното съединение ще ви даде 250 000 000 000 реда, но търсенето е лесно, тъй като трябва да погледнете само една от колоните с места (т.е. SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100 , вторият ще ви даде значително по-малко редове, но след това заявката трябва да вземе предвид както колоната Place1, така и Place2).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Комбинирайте колона varchar с колона int

  2. Изтичане на памет в .net приложение

  3. Как да коригирате „името на профила не е валидно“ при актуализиране на пощенски профил на база данни в SQL Server (T-SQL)

  4. Множество изрази „in“ в клауза where, които трябва да съвпадат един с друг

  5. Намиране на едновременни събития в база данни между времена