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 (特別参照 ID 番号) を取得します。この場合、SRID は標準緯度経度である 4326 です。すでに緯度と経度があるので、ALTER TABLE するだけです。 地理列を追加してから UPDATE

    テーブルからデータを取得する 2 つの方法を示しましたが、これを使用してインデックス付きビューを作成することはできません (インデックス付きビューには自己結合を含めることはできません)。ただし、上記に基づいて設定された、実質的にキャッシュであるセカンダリ テーブルを作成することもできます。次に、それを維持することを心配する必要があります (トリガーまたは他のプロセスを介して行うことができます)。

    クロス結合により 250,000,000,000 行が得られることに注意してください。ただし、場所列の 1 つを確認するだけでよいため、検索は簡単です (つまり、SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100 、2 番目は大幅に少ない行が得られますが、クエリでは Place1 列と Place2 列の両方を考慮する必要があります)。




    1. MERGE / INSERT / DELETE SQLコマンドの複数のOUTPUT句?

    2. Doctrine 2 @Gedmo\SoftDeleteableおよび一意のフィールド

    3. 空のテーブルでのクエリの実行が遅い。 (大量のインサートを削除した後)

    4. PostgreSQLでこの時間の操作クエリを実行します