在处理包含大量数据的列(空间列等)时加速访问数据库的策略
Strategies to speed up access to databases when working with columns containing massive amounts of data (spatial columns, etc)
首先,我是一名业余爱好者,self-taught ruby 程序员,在 super-fast 计算机时代成为一名新手工程师,程序效率不是问题在我的主要 GIS 软件开发项目的早期阶段。这种技术债务开始加重我的项目负担,我想加快访问这个笨拙的 GIS 数据库的速度。
它是一个带有 postgis 扩展的 postgresql 数据库,在 rails 内部控制,当访问 and/or 操作数据库记录时,它会立即通过数据库列的 object-ification 产生效率问题或许多包含文本或空间数据的列,每列很容易超过 1 兆字节。
现在特别慢,以前不是这样的
一个策略:我正在考虑构建 child table 我的大型空间数据 table(州、县、人口普查区等),这样当我访问tables 我不必每次访问 objects 时都加载大量空间列。但是在 parent table 的 children 上进行空间查询可能会很困难。不确定我会怎么做,但我认为这是可能的。
可能我的索引太多了。我有很多空间索引。我目前未使用的 tables 中的其他空间索引是否会减慢我的查询速度?一个吃太多怎么样 table?
这些 table 有大量的列。也许我应该删除一些列,或者为具有大量序列化哈希的列创建 parent tables?
有很多 table 我不再使用了。除了整洁之外,还有其他原因可以删除这些未使用的 tables 吗?他们会减慢我的查询速度吗?简单地对其中一些 table 执行 #count 方法需要时间。
PS:
- 8 小时后回顾这件事,我想我同样想了解的是,在优化 (rails) 数据库性能方面,上述技术中有多少是完全无用的?
索引。如果您使用 postgres 在单个字段中存储如此大的数据块,请考虑将其存储为数组、JSON 或 Hstore 字段。如果您使用 gin 索引类型对其进行索引,那么您可以在给定字段中进行有效搜索。
您不必阅读 table 的所有专栏。只读你需要的。
您可以:
MyObject.select(:id, :col1, :col2).where(...)
...并且省略的列未被读取。
如果您尝试使用需要您省略的列之一的方法,那么您将得到一个 ActiveModel::MissingAttributeError (Rails 4),但您大概知道什么时候是否需要它们。
如果您有完整的 table 扫描,table 中包含大数据集将是数据库方面的一个明显问题,然后您可能会考虑将这些数据移动到其他tables.
如果您只使用 Rails 读取和写入大数据列,而不对其使用 PostgreSQL 函数,您可能能够在写入时压缩数据并在读取时解压缩。使用 write_attribute 和 read_attribute 覆盖 getter 和 setter 方法,压缩和解压缩(当然分别)数据。
首先,我是一名业余爱好者,self-taught ruby 程序员,在 super-fast 计算机时代成为一名新手工程师,程序效率不是问题在我的主要 GIS 软件开发项目的早期阶段。这种技术债务开始加重我的项目负担,我想加快访问这个笨拙的 GIS 数据库的速度。
它是一个带有 postgis 扩展的 postgresql 数据库,在 rails 内部控制,当访问 and/or 操作数据库记录时,它会立即通过数据库列的 object-ification 产生效率问题或许多包含文本或空间数据的列,每列很容易超过 1 兆字节。
现在特别慢,以前不是这样的
一个策略:我正在考虑构建 child table 我的大型空间数据 table(州、县、人口普查区等),这样当我访问tables 我不必每次访问 objects 时都加载大量空间列。但是在 parent table 的 children 上进行空间查询可能会很困难。不确定我会怎么做,但我认为这是可能的。
可能我的索引太多了。我有很多空间索引。我目前未使用的 tables 中的其他空间索引是否会减慢我的查询速度?一个吃太多怎么样 table?
这些 table 有大量的列。也许我应该删除一些列,或者为具有大量序列化哈希的列创建 parent tables?
有很多 table 我不再使用了。除了整洁之外,还有其他原因可以删除这些未使用的 tables 吗?他们会减慢我的查询速度吗?简单地对其中一些 table 执行 #count 方法需要时间。
PS: - 8 小时后回顾这件事,我想我同样想了解的是,在优化 (rails) 数据库性能方面,上述技术中有多少是完全无用的?
索引。如果您使用 postgres 在单个字段中存储如此大的数据块,请考虑将其存储为数组、JSON 或 Hstore 字段。如果您使用 gin 索引类型对其进行索引,那么您可以在给定字段中进行有效搜索。
您不必阅读 table 的所有专栏。只读你需要的。
您可以:
MyObject.select(:id, :col1, :col2).where(...)
...并且省略的列未被读取。
如果您尝试使用需要您省略的列之一的方法,那么您将得到一个 ActiveModel::MissingAttributeError (Rails 4),但您大概知道什么时候是否需要它们。
如果您有完整的 table 扫描,table 中包含大数据集将是数据库方面的一个明显问题,然后您可能会考虑将这些数据移动到其他tables.
如果您只使用 Rails 读取和写入大数据列,而不对其使用 PostgreSQL 函数,您可能能够在写入时压缩数据并在读取时解压缩。使用 write_attribute 和 read_attribute 覆盖 getter 和 setter 方法,压缩和解压缩(当然分别)数据。