Saya memiliki sekitar 75 juta catatan dalam database SQL Server 2008 R2 Express. Masing-masing panjang lat terkait dengan beberapa nilai. Tabel memiliki kolom geografi. Saya mencoba menemukan tetangga terdekat untuk garis bujur lintang (titik) tertentu. Saya sudah memiliki kueri dengan indeks spasial di tempat. Tetapi tergantung pada di mana catatan berada dalam database, katakanlah kuartal pertama atau kuartal terakhir, kueri dapat memakan waktu sekitar 3 hingga 30 detik untuk menemukan tetangga terdekat. Saya merasa ini dapat dioptimalkan untuk memberikan hasil yang jauh lebih cepat dengan mengoptimalkan kueri atau indeks spasial. Sekarang menerapkan beberapa indeks spasial dengan pengaturan default. Berikut ini tabel dan kueri saya.
CREATE TABLE lidar(
[id] [bigint] IDENTITY(1,1) NOT NULL,
[POINTID] [int] NOT NULL,
[GRID_CODE] [numeric](17, 8) NULL,
[geom] [geography] NULL,
CONSTRAINT [PK_lidar_1] PRIMARY KEY CLUSTERED ([id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Indeks spasial yang saya gunakan:
CREATE SPATIAL INDEX [SPATIAL_lidar] ON [dbo].[lidar] ([geom]) USING GEOGRAPHY_GRID
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Inilah Query yang saya gunakan:
declare @ms_at geography = 'POINT (-95.66 30.04)';
select TOP(1) nearPoints.geom.STAsText()as latlon
from
(
select r.geom
from lidar r With(Index(SPATIAL_lidar))
where r.geom.STIntersects(@ms_at.STBuffer(1000)) = 1
) nearPoints
Berikut ini adalah contoh lat long dalam database saya. untuk memberikan gagasan tentang akurasi dan kepadatan. Semua 70 juta catatan adalah untuk satu kota (data Lidar).
POINT (-95.669434934023087 30.049513838913736)
Sekarang kueri ini memberi saya hasil seperti yang saya jelaskan di atas, tetapi saya ingin meningkatkan kinerja sebanyak mungkin. Dugaan saya adalah dengan mengubah nilai default indeks spasial saya mungkin di atas untuk mengoptimalkan kinerja dengan lebih baik. Ada petunjuk tentang ini?
Saya mencoba memvariasikan buffer dari 10 hingga 1000 tetapi dengan hasil yang hampir sama.
Juga ada saran lain untuk meningkatkan kinerja.
Inilah sistem yang saya gunakan saat ini:
Windows 7 64bit Professional
Intel(R) Core(TM)2 Quad CPU Q9650 @ 3.00GHz (4 CPUs), ~3.0GHz
Ram: 8 GB
NVIDIA GeForce 9500 GT
lidar
tag.Jawaban:
Coba jalankan prosedur tersimpan sp_help_spatial_geography_index untuk mendapatkan detail tentang bagaimana indeks spasial Anda digunakan. Anda harus dapat menggunakan sesuatu seperti:
Posting hasil dalam pertanyaan Anda untuk melihat apakah ada yang menonjol. Arti untuk masing-masing item dapat ditemukan di sini .
Jika koordinat Anda diproyeksikan maka Anda juga bisa melakukan kueri non-spasial sederhana pada bidang X yang dihitung, Y, dan memeriksa X <MinX dan X> MaxX dll.
Memproyeksikan koordinat Anda (dalam bidang tipe GEOMETRI) juga memungkinkan Anda untuk membatasi indeks spasial Anda sejauh data yang dapat mempercepat kinerja jauh. Ganti luasan dunia dengan luasan data Anda:
sumber
Pertimbangkan untuk menyederhanakan buffer dengan BufferwithTolerance . Jika poin dikemas dengan ketat, sistem harus mengidentifikasi jika suatu titik berada di kedua sisi batas. Semakin sederhana garis itu, semakin sedikit pekerjaan yang harus dilakukan mesin.
sumber
Lihatlah sumber daya ini oleh Isaac Kunen tentang menggunakan tabel angka untuk mengoptimalkan tetangga terdekat menggunakan indeks spasial
http://blogs.msdn.com/b/isaac/archive/2008/10/23/nearest-neighbors.aspx
sumber