如何加快对栅格数据库的查询?


16

我在postgresql / postgis中有一个带有以下列的栅格数据库:

(ID,rast,data_of_data)

“ rast”是具有WKT格式的栅格文件的列。以下示例查询用于查找WGS84系统(30.424,-1.66)中某个点的DN值(对于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

加上:rast列的SRID是什么?
dwurf

Answers:


12

这是一个令人兴奋的问题!您要查询的栅格有多大?WKTRaster 作为BLOB存储在数据库。为了找到特定点的值,使用(dx,dy)步骤和旋转从已知的(x_0,y_0)角坐标行/列索引(i,j)计算。使用(i,j)已知,ST_Value()函数可以以正确的字节偏移量访问实际数据。

这意味着,在回答一个查询点时,DB必须平均读取至少一半的数据块(取决于实现方式,它实际上可能一直在读取所有数据)。因此,我这WKTRaster性能会受到影响,当数据的BLOB得到太大。切片数据集应加快查询速度。看一下本教程中如何处理SRTM数据(以6000x6000像素块为单位)。他们实际上将数据平铺成非常小的50x50像素,这清楚地表明我的猜测可能与事实相差不远。

在空间上为栅格数据建立索引可能只会对边界框建立索引,这对您的问题没有真正的帮助。


1
平铺的东西似乎是必经之路-请参见此链接。您还需要添加这样的索引:CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));source
dwurf 2012年

4

我发现加快了PostGIS栅格计算的两个方面,就是在栅格中使用整数值,并在可能的情况下使用多波段栅格。在这种情况下,是否可以将DN值存储为整数?

另一个想法(我不确定这里是否有意义)是使用多波段栅格。例如,如果您要查看每月的数据切片,则每个月可能是一个栅格图层。然后,您可以通过查询分层栅格来检索不同时间片上某个点的多个值。我发现这种方法比查询单独的栅格要快得多。

最后,当您加载数据时,会有TILE_SIZE-t标志。您可以探索正在使用的图块大小是否适合您的查询。


如果您需要同时查询同一像素值几个月(以坚持您的示例),例如分析时间序列,则多波段栅格可能会有所帮助。问题中的查询仅检索一个特定日期。如果日期包含在一个带中​​,则DBMS也需要读取所有其他带,即使它们对回答查询没有兴趣。这可能会降低性能。
bhell 2012年

我同意-也许我没有强调,它仅在同时需要多个值时才有用;我会澄清这一点。
djq 2012年

3

根据数据的分布,仅通过索引date_of_data列即可获得一些非常好的加速效果。

您可以使用EXPLAIN ANALYZE语法来确定是否正在使用索引。


什么样的指标?你可以再详细一点吗?
f.ashouri

只是一个标准的btree索引:create index tbl_name_date_idx on tbl_name (date_of_data)。如果您有许多不同的日期,则将大大减少PostGIS必须处理的数据量。
dwurf 2012年

谢谢,但是对我的查询无效。
f.ashouri

它怎么不起作用?没有明显的性能提升或其他问题?如果您有一个定期出现在WHERE子句中的表列,则应始终考虑为其编制索引。在这种情况下,如果您有许多不同的日期(例如,较大的值域),则不仅会有所帮助,而且如果表中有大量的记录,这也将有所帮助。
2012年

查询使用索引吗?您可以粘贴bin的输出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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.