Як прискорити запити растрових баз даних?


16

У мене є растрова база даних у postgresql / postgis з цими стовпцями:

(ID, rast, data_of_data) .

'rast' - це стовпець, що містить растрові файли у форматі WKT. Приклад запиту для пошуку значення DN точки в системі WGS84 (30.424, -1.66) і для 2002-01-09 є наступним:

SELECT 
     st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val
FROM 
     my_table
WHERE
     date_of_data='2002-01-09'

Чи існує метод (наприклад, просторовий індекс) для прискорення таких запитів?


Можливо, ви могли б нам допомогти, надавши ще детальну інформацію: Скільки записів є у my_table? Наскільки великі дані в растровій колонці? Скільки чітких дат у вас у date_of_data?
dwurf

Додайте до цього: що таке SRID стовпця "rast"?
dwurf

Відповіді:


12

Це хвилююче питання! Наскільки великий растр, який ви хочете запитати? WKTRaster зберігається в базі даних як BLOB . Щоб знайти значення в конкретній точці, з відомих (x_0, y_0) кутових індексів рядків / стовпців координат (i, j) обчислюються за допомогою (dx, dy) кроків та обертання. З (i, j) відомо, що функція ST_Value () може отримати доступ до фактичних даних при правильному зміщенні байтів.

Це означає, що БД повинен читати в середньому принаймні половину блоку даних, відповідаючи на запит на точку (залежно від реалізації, вона може фактично читати всі дані в усі часи). Тому я б здогадувався, що продуктивність WKTRaster погіршується, коли BLOB даних стає занадто великим. Облицювання набору даних має пришвидшити запити. Подивіться, як у цьому підручнику обробляються дані SRTM (надходять у шматки 6000x6000 пікселів) . Вони насправді розбивають дані на дійсно невеликі 50х50 пікселів, що є явним натяком на те, що мої здогадки можуть бути не надто далеко від правди.

Просторова індексація растрових даних, ймовірно, просто індексує обмежувальне поле, що не є реальною допомогою для вашої проблеми.


1
Здається, що це стосується плитки - дивіться за цим посиланням . Вам також потрібно буде додати такий індекс, як цей: CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));( джерело )
dwurf

4

Два аспекти, за якими я знайшов прискорення моїх растрових обчислень PostGIS, використовували цілі значення в растрі та використовували багатодіапазонні растри, де це можливо. Чи може в цьому випадку значення DN зберігатися як цілі числа, якщо це вже не робиться?

Інша думка (і я не впевнений, що це доречно тут) - використовувати багатодіапазонні растри. Наприклад, якщо ви переглядаєте щомісячні фрагменти даних, кожен місяць може бути шаром растру. Потім ви можете отримати декілька значень точки в різний час відрізки, запитуючи шаруватий растр. Я знайшов цей підхід набагато швидшим, ніж запит окремих растрових.

Нарешті, коли ви завантажуєте свої дані, з'являється -tпрапор для TILE_SIZE . Ви можете дослідити, чи добре працює розмір плитки для вашого запиту.


Багатополосні растри, ймовірно, допоможуть, якщо вам потрібно запитувати одне і те ж значення пікселя протягом декількох місяців одночасно (дотримуватися вашого прикладу), наприклад, аналізувати часові ряди. Запит у питанні отримує лише одну конкретну дату. Якщо дата містилася в одній смузі, СУБД також повинна була б прочитати всі інші діапазони, хоча вони не представляють інтересу для відповіді на запит. Це, мабуть, погіршить ефективність роботи.
bhell

Я згоден - можливо, я не підкреслював, що це корисно лише тоді, коли одночасно потрібно кілька значень; Я уточню це.
djq

3

Залежно від розповсюдження ваших даних, ви можете отримати дуже хороші прискорення, просто проіндексувавши date_of_dataстовпець.

Ви можете використовувати синтаксис EXPLAIN ANALYZE, щоб визначити, використовуються чи ні ваші індекси.


який індекс? ви могли б бути більш конкретними?
f.ashouri

Просто стандартний індекс ВТКЕЯ: create index tbl_name_date_idx on tbl_name (date_of_data). Якщо у вас є багато чітких дат, це різко скоротить обсяг даних, які PostGIS повинен обробляти.
dwurf

Дякую, але це не спрацювало для мого запиту.
f.ashouri

Як це не вийшло? Немає помітного підвищення продуктивності чи інших проблем? Якщо у вас стовпчик таблиці, який регулярно відображається в WHEREпункті, завжди слід розглянути питання про його індексацію. У цьому випадку це допоможе не тільки якщо у вас є багато чітких дат (тобто велика область домену), але і якщо у вас є велика кількість записів у таблиці.
bhell

Чи використовується запит за допомогою індексу? Чи можете ви вставити вихід explain analyze SELECT st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val from my_table where date_of_data='2002-01-09'?
dwurf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.