【问题标题】:SQL Server to PostgreSQL - Migration and design concernsSQL Server 到 PostgreSQL - 迁移和设计问题
【发布时间】:2010-03-21 08:42:40
【问题描述】:

目前正在从 SQL Server 迁移到 PostgreSQL,并正在尝试改进几个关键领域:

我有一个文章表:

CREATE TABLE [dbo].[Articles](
    [server_ref] [int] NOT NULL,
    [article_ref] [int] NOT NULL,
    [article_title] [varchar](400) NOT NULL,
    [category_ref] [int] NOT NULL,
    [size] [bigint] NOT NULL
)

数据(逗号分隔的文本文件)每天由大约 500 个(大约 1000 个)服务器转储到导入服务器上。

进口:

  • “文章”表中的索引已禁用。
  • 对于每个转储的文本文件
    • 数据被 BULK 复制到临时表中。
    • 临时表已更新。
    • 服务器的旧数据已从“文章”表中删除。
    • 临时表数据被复制到 Articles 表中。
    • 临时表已删除。

一旦为所有服务器完成此过程,就会构建索引并将新数据库复制到 Web 服务器。

我对这个过程相当满意,但在我努力实现实时(哈哈!)系统时,总是有改进的余地。我在做什么正确吗? Articles 表包含约 5 亿条记录,并且预计会增长。搜索此表是可以的,但可能会更好。即SELECT * FROM Articles WHERE server_ref=33 AND article_title LIKE '%criteria%' 已经令人满意,但我想提高搜索速度。显然,“LIKE”是我的问题。建议? SELECT * FROM Articles WHERE article_title LIKE '%criteria%' 太可怕了。

分区是 SQL Server Enterprise 的一项功能,但 $$$ 是 PostgreSQL 众多令人兴奋的前景之一。导入过程(删除数据、插入数据)和构建索引会对性能造成什么影响?数据库会大幅增长吗?

数据库目前为 200 GB,并将不断增长。通过网络复制它并不理想,但它可以工作。我正在考虑改变系统的硬件结构。拥有一个导入服务器和一个 Web 服务器的思想过程是,导入服务器可以做脏活(没有索引),而 Web 服务器(有索引)可以呈现报告。也许将系统减少到一台服务器可以跳过网络阶段的复制。这台服务器将有两个版本的数据库:一个带有用于交付报告的索引,另一个不用于导入新数据。数据库每天都会交换。想法?

这是一个了不起的系统,不管你信不信,通过给它一个大的震动,我的疯狂有一些方法。

更新:我不是在寻求关系数据库方面的帮助,而是希望与数据仓库专家交流想法。

【问题讨论】:

  • 不要使用 LIKE,而是使用全文索引(postgres 和 mysql 在某种程度上都支持),或者像 lucene 这样的完全外部搜索解决方案。
  • 我知道这两种技术,但已经有几年没有接触过它们了。我会做一些阅读。

标签: sql-server database-design postgresql


【解决方案1】:

我不是数据仓库专家,但请多指教。

您的数据似乎可以轻松分区。请参阅 Postgresql documentation about partitioning 了解如何将数据拆分到不同的物理表中。这使您可以按每个服务器的自然粒度管理数据。

您可以使用 postgresql 事务 DDL 来避免一些复制。对于每个输入文件,该过程将如下所示:

  1. 创建一个新表来存储数据。
  2. 使用 COPY 将数据批量加载到表中。
  3. 创建任何必要的索引并执行任何所需的处理。
  4. 在事务中删除旧分区,重命名新表并将其添加为分区。

如果您这样做,您可以随时更换分区。只有最后一步需要锁定实时表,这是一个快速的 DDL 元数据更新。

避免删除数据并将数据重新加载到索引表 - 由于 PostgreSQL 使用的 MVCC 机制,这将导致相当大的表和索引膨胀。如果你只是换掉基础表,你会得到一个很好的紧凑表和索引。如果您在查询中的分区之上有任何数据局部性,则可以对输入数据进行排序,或者如果这不可能,请使用 PostgreSQL cluster functionality 对数据进行物理重新排序。

如果约束条件可接受(只能在单词边界处搜索),请使用 GIN 全文索引来加快文本搜索速度。或者,如果您需要搜索任意子字符串,请使用三元组索引(由 pg_trgm extension module 提供)。

【讨论】:

  • 这很棒。那么可以为每个服务器创建一个分区吗?分区数量有限制吗?我记得在 MySQL 中读到这是 1024,但不能确定,也找不到 PostgreSQL 的数字。
  • 对分区的数量没有实际限制,但是由于 Postgresql 分区的工作方式,您应该超过一百个左右。它比它必须的更通用,允许任何类型的分区,你可以用 SQL 表达式表达,缺点是当优化主表上的查询时,Postgresql 不能利用分区中的任何结构表达式并且必须分别排除每个分区。这可能会导致查询计划时间过长。
  • 如果您可以将查询从具有大量表的查询内部定向到正确的分区,那将不是什么大问题。当然,它们之间的联合比跨一个大表或在散列函数上分区的较小数字要慢。
  • 好吧,当你说“但你应该超过 100”时,你的意思是“但你不应该超过 100”吗?
  • 是的,我不小心忘记输入“not”了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 2019-09-25
  • 2014-10-13
  • 1970-01-01
相关资源
最近更新 更多