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

оптимизирайте заявката за най-близък съсед на 70 милиона пространствени облака от точки с изключително висока плътност на SQL Server 2008

Съжаляваме, но това не е SQL отговор, а начин за постигане на предвидима производителност, приемайки определени ограничения върху вашите данни.

Колко често се променят данните? Ако е възможно, можете ли да изчислите предварително графика на всеки обект 5 най-близки съседи и да го използвате, за да ускорите избора си.?

Ако тези данни са предимно само за четене, тогава...

Колко равномерно са разпределени тези точки? Ако разпределението е сравнително равномерно и добре познато, тогава бихте ли могли да направите свое собствено пространствено картографиране чрез групиране на всяка координата и индекс в хеш-таблица.

Ако не е необходимо да разполагате с данните в базата данни, преместете ги във файл с карта на паметта за бързи хеш търсения. (70 милиона записа трябва лесно да се поберат в паметта).

Използвах тази архитектура, за да генерирам справки за под милисекунди за дисплейна реклама и уместност на търсачката.

==Разработка==

Вие просто създавате мрежа от квадрати с фиксиран размер (като шахматна дъска) и картографирате всяка точка в мрежата и създавате списък с обектите, които принадлежат към всяко от полетата на мрежата -- ако коригирате размера на всяко кутия правилно, трябва да имате средно 5-50 точки във всеки квадрат -- Това по принцип е четворно дърво, но без дървото за простота.

За всяка кофа, която е празна, след като сте разпръснали всички данни в кофи, добавяте информация кои най-близки кофи съдържат данни.

Вече можете да номерирате всяка кофа отляво надясно-ред-ни-ред, така че всяка кофа да има уникален номер, който може да се изчисли от координатите -- и вмъквате всяка кофа в хеш-таблица или, ако пространството позволява, точно както права справочна таблица.

Сега, когато имате заявката си, вие просто изчислявате към коя кофа ще се съпостави и ще получите или списък с обекти в тази кофа, или ще получите „празна“ кофа, която съдържа указателите към най-близката кофа, която има съдържание .

Това ще ви даде първия списък с кандидати с обекти, които търсите, а сега просто трябва да избягате и да видите кой е най-близкият.

В 99% от случаите това ще бъде -- но ако се притеснявате, че има (а) или има някои кандидати в следващите кофи, които всъщност са по-близо, тогава просто проверете 8-те околни кофи и вижте дали можете намерете по-близо там.

Ако сега също искате да получите списък на всички обекти, които са най-близки, тогава също изчислете проста мрежа от 5 най-близки съседи за всеки обект, така че ще получите структура от данни като A->{B,C,D ,E,F}, B->{A,D,G,H,I}, C->{A,J,K,G,M}....

Това ще формира проста мрежа, която вече можете да обхождате с вариант на Dijkstra тук, за да получите всички точки, съседни на най-близката ви точка.

Изграждането на структурите от данни ще отнеме време, но веднъж направено и направено правилно, търсенето и връщането на набор от данни може да се извърши за под милисекунди (без да се включва каквато и да е http или комуникация извън кутията)

Надявам се това да помогне.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Конфигуриране на Database Mail в SQL Server

  2. Как да покажете съпоставянето на база данни в SQL Server (T-SQL)

  3. SQL Server заявка за намиране на всички текущи имена на база данни

  4. Вземете първия ден от седмицата в SQL Server

  5. Групиране по sql заявка в колона, свързана със запетая