2009-10-26 63 views
1

目前从SQL Server迁移到PostgreSQL和试图改善在路上几个关键领域:SQL服务器到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服务器。

我对这个过程非常满意,但是在争取实时(哈哈!)系统时总会有改进的空间。我所做的是正确的?文章表包含约5亿条记录,预计会增长。在这张桌子上搜索是可以的,但可能会更好。即SELECT * FROM Articles WHERE server_ref=33 AND article_title LIKE '%criteria%'已经令人满意,但我想提高搜索速度。显然,“喜欢”是我的问题。建议? SELECT * FROM Articles WHERE article_title LIKE '%criteria%'是可怕的。

分区是SQL Server Enterprise的一个功能,但$$$是PostgreSQL许多令人兴奋的前景之一。导入过程(丢弃数据,插入数据)和建立索引会产生什么性能影响?数据库会增长很多吗?

该数据库目前在200 GB,并将增长。在网络上复制这个并不理想,但它起作用。我正在考虑改变系统的硬件结构。有一个导入服务器和一个Web服务器的思想过程是这样的,即导入服务器可以在Web服务器(WITH索引)可以显示报告的同时执行肮脏的工作(无索引)。也许将系统缩小到一台服务器可以避免在整个网络阶段进行复制。这一台服务器将有两个版本的数据库:一个用于传递报告的索引,另一个用于导入新数据。数据库将每天交换。思考?

这是一个梦幻般的系统,并且相信它有没有一些方法可以让我的疯狂产生巨大的变化。

更新:我不是在寻找关系型数据库的帮助,而是希望能够与数据仓库专家们一起反弹。

+0

而不是使用LIKE,查看全文索引(postgres和mysql支持,在某种程度上)或者像lucene这样的完全外部搜索解决方案。 – 2009-10-26 20:29:02

+0

我意识到这两种技术,但几年来一直没有触及它们。我会做一些阅读。 – youwhut 2009-10-27 09:53:23

回答

1

我不是数据仓库专家,而是几个指针。

似乎您的数据可以很容易地分区。请参阅Postgresql documentation about partitioning关于如何将数据拆分为不同的物理表。这使您可以按自然的每服务器粒度管理数据。

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

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

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

避免删除数据并将数据重新加载到索引表 - 由于PostgreSQL使用的MVCC机制,这会导致相当多的表和索引膨胀。如果你只是换出基础表,你会得到一个不错的紧凑表和索引。如果您在查询分区的顶部有任何数据位置,那么要么在您的查询中对输入数据进行排序,要么使用PostgreSQL cluster functionality对数据进行物理重新排序。

如果约束条件可以接受(只能在字边界搜索),为了加速文本搜索,请使用GIN全文索引。或者如果您需要搜索任意子字符串,则使用trigram索引(由pg_trgm extension module提供)。

+0

这太好了。那么可以为每个服务器创建一个分区?分区数量是否有限制?我记得在MySQL读取这是1024,但不能确定,并找不到PostgreSQL的数字。 – youwhut 2009-10-27 16:30:09

+0

分区数量没有实际的限制,但由于Postgresql分区的工作方式,您应该远远超过一百个分区。它具有更多的通用性,因此允许使用SQL表达式进行任何形式的分区,但优化主表上的查询时,Postgresql无法利用分区中的任何结构表达式并且必须分开排除每个分区。这可能会导致查询计划时间过长。 – 2009-10-27 18:56:00

+0

如果您可以将查询从查询​​中引导到正确的分区,那么拥有大量表的查询不会是一个大问题。跨越它们的联盟当然会比跨越一个大表更慢,或者在散列函数上分配更小的数字。 – 2009-10-27 18:58:29