sql >> Databasteknik >  >> RDS >> Sqlserver

optimera närmaste grannefråga på 70 miljoner rumsliga punktmoln med extremt hög densitet på SQL Server 2008

Tyvärr, men det här är inte ett SQL-svar, utan ett sätt att få förutsägbar prestanda med vissa begränsningar för din data.

Hur ofta ändras data? Om möjligt, skulle du kunna förberäkna en graf över varje enhets 5 närmaste grannar och använda det för att påskynda ditt val.?

Om dessa data mestadels är skrivskyddade, då...

Hur jämnt fördelas dessa poäng? Om fördelningen är ganska jämn och välkänd, kan du rulla din egen rumsliga kartläggning genom att placera varje koordinat och index i en hashtabell.

Om du inte behöver ha data i databasen, flytta ut den till en minnesmappad fil för snabba hash-sökningar. (70m rekord bör lätt passa i minnet).

Jag har använt den här arkitekturen för att generera sökningar på under millisekunder för visningsannonsering och sökmotorrelevans.

==Utveckling==

Du skapar helt enkelt ett rutnät med rutor med fast storlek (som ett schackbräde), och du mappar varje punkt i rutnätet, och du skapar en lista över de objekt som hör hemma i var och en av rutnätsrutorna -- om du justerar storleken på varje boxas korrekt, du bör i genomsnitt ha 5-50 poäng i varje ruta -- Detta är i princip ett quad-tree men utan trädet för enkelhetens skull.

För varje hink som är tom efter att du har spridit all data i hinkar lägger du till information om vilka närmaste hinkar som innehåller data.

Du kan nu numrera varje hink vänster-till-höger-linje-ny-linje så att varje hink har ett unikt nummer som kan beräknas utifrån koordinaterna -- och du infogar varje hink i en hashtabell, eller om utrymmet tillåter precis som en rak uppslagstabell.

Nu när du har din fråga, beräknar du helt enkelt vilken hink som kommer att mappas till, och du får antingen en lista över objekt i den hinken, eller så får du en "tom" hink som innehåller pekarna till närmaste hink som har innehåll .

Det ger dig den första kandidatlistan över objekt som du letar efter, och nu är det bara att springa och se vilket som är närmast.

I 99 % av fallen skulle det vara det -- men om du är orolig för att det (a) antingen finns några kandidater i nästa hinkar som faktiskt är närmare, kontrollera bara de 8 omgivande hinkarna och se om du kan hitta någon närmare där.

Om du nu också vill få en lista över alla objekt som är närmast, så beräkna även ett enkelt nätverk av 5 närmaste grannar för varje objekt, så du får en datastruktur som A->{B,C,D ,E,F}, B->{A,D,G,H,I}, C->{A,J,K,G,M}...

Det kommer att bilda ett enkelt nätverk som du nu kan passera med en variant av Dijkstra här för att få alla punkter intill din närmaste punkt.

Att bygga datastrukturerna kommer att ta tid, men när det väl är gjort och gjort rätt kan uppslagning och returnering av en datauppsättning göras på under millisekunder (inte inklusive någon http eller off-box kommunikation av orsaken)

Hoppas detta hjälper.



  1. Java JDBC Primary Key Oracle Database

  2. Får MYSQL Fel:Felkod:2006 - MySQL-servern har försvunnit

  3. FEL:Fel 1005:Kan inte skapa tabellen 'cat10e.recording' (felnr:150)

  4. Varför returnerar Oracle en specifik sekvens om "orderby"-värdena är identiska?