sql >> Databáze >  >> RDS >> PostgreSQL

Dotaz podle souřadnic trvá příliš dlouho – možnosti optimalizace?

Budete na tom mnohem lépe s prostorovým indexem, který používá R-strom (v podstatě dvourozměrný index, který funguje tak, že rozděluje prostor do rámečků), a bude mít mnohem lepší výkon než větší než, menší než srovnání na dvou samostatných lat. , hodnoty lon pro tento druh dotazu. Nejprve však budete muset vytvořit typ geometrie, který pak indexujete a použijete ve svém dotazu namísto samostatných párů zeměpisná šířka/délka, které aktuálně používáte.

Následující vytvoří typ geometrie, naplní jej a přidá k němu index, čímž zajistí, že se jedná o bod a v zeměpisné šířce/délce, známé jako EPSG:4326

alter table event add column geom geometry(POINT, 4326);
update event set geom=ST_SetSrid(ST_MakePoint(lon, lat), 4326);
create index ix_spatial_event_geom on event using gist(geom);

Poté můžete spustit následující dotaz, abyste získali své události, které budou používat prostorový průsečík, který by měl využívat váš prostorový index:

Select * from events where ST_Intersects(ST_SetSRID(ST_MakeBox2D(ST_MakePoint(swLon, swLat), 
    ST_MakePoint(neLon, neLat)),4326), geom) 
order by relevancy desc limit 100;

Ohraničovací rámeček pro svůj průsečík vytvoříte pomocí ST_MakeBOX2D se dvěma sadami bodů, které budou na diagonálních rozích ohraničujícího rámečku, takže dvojice JZ a SV nebo SZ a JV by fungovaly obě.

Když na to spustíte vysvětlení, měli byste zjistit, že je zahrnut prostorový index. To bude fungovat mnohem lépe než dva samostatné indexy na sloupcích lon a lat, protože narazíte pouze na jeden indexovaný, optimalizovaný pro prostorové vyhledávání, spíše než na dva B-stromy. Uvědomuji si, že to představuje jiný způsob, jak to udělat, a neodpovídá vám na původní otázku, leda nepřímo.

UPRAVIT: Mike T velmi dobře poznamenal, že pro hledání ohraničujícího rámečku v 4326 je vhodnější a rychlejší použít datový typ geometrie a operátor &&, protože SRID bude stejně ignorováno, např.

 where ST_MakeBox2D(ST_MakePoint(swLon, swLat), ST_MakePoint(neLon, neLat)) && geom



  1. Jak uložit video obsah v databázi SQLite (nikoli cestu videa)

  2. jak shromáždit více hodnot jako jeden řetězec v postgresu?

  3. Automatizované testování procesu upgradu serveru MySQL/MariaDB/Percona

  4. PHP PDO MySQL dotaz LIKE -> více klíčových slov