Postgres中的多个表与表索引

时间:2013-06-12 19:18:03

标签: sql postgresql indexing

我是一名几乎没有SQL经验的前端开发人员。我正在考虑为我工作的组织开发数据查询系统。

目前,大部分数据都在一系列电子表格中。我有近100个工作表(即表格)来自同一个模板(包括国家一栏),但基于工作表的规划方案(例如“有效”)和经济部门(例如“农业”)具有不同的值。每个工作表大约有8000行。

我是否为每个工作表创建单独的数据库表 - 即使表中的语句具有相同的CREATE语句?在这种情况下,我想我会沿着这些线创建一个索引:

CREATE INDEX sector_scenario_lower_country ON sector_scenario(lower(country));

我必须创建此索引100次(每个sector_scenario表一次)。当我想找到我正在寻找的数据行时,我必须使用我的应用程序来识别正确的表(这确实应该不是很麻烦或花费很多时间)然后进行查询:

SELECT col4, col5, col6 FROM sector_scenario WHERE lower(country) = "brazil";

或者我应该将场景和扇区的列添加到数据库表中,然后将所有工作表复制到该单个表中?

在这种情况下,我只创建一次以下索引:

 CREATE INDEX main_table_idx ON  main_table(scenario, sector, lower(country));

然后我会定期进行以下查询:

SELECT col4, col5, col6 FROM main_table WHERE scenario = "efficient" AND sector = "agriculture" AND lower(country) = "brazil";

显然,第二个选项的设置工作要少得多。但是,我可以期待它的性能相当吗?

2 个答案:

答案 0 :(得分:3)

第二种解决方案是正确的解决方案 - 将所有行放入一个表并为该一个表构建索引。

只有在非常罕见的情况下才会将数据分成不同的表格。我能想到的唯一一个是用户要求他们的数据与其他人的数据分开存储。

一个问题是第一个场景中索引的总体大小是否与第二个场景中的大小相当。鉴于第一个场景中的索引平均有半个空页(最后),我怀疑它们可能更大。存储场景的额外开销仅在每个值上发生一次。在没有实际测试大小的情况下,我认为数据大小有利于单表方法。

还有其他可能性,在每个表中处理大量数据可能会导致表或索引溢出可用内存。如果这是一个问题,那么分解表是一件好事。但是,正确的方法是使用分区将每个段拆分为一个单独的表 - 而不是单独管理一堆表。

答案 1 :(得分:1)

你没有提供足够的信息来提供非常详细的答案,但我不打算记录你说你很可能需要/想要一张桌子。性能将取决于此处列出的太多东西(硬件,配置等),但PostgreSQL应该没有8M行的问题。如果您正确索引它,将会看到更好的性能。为此,请确保在pgAdminIII中编写查询并使用analyze函数。您需要对如何解释结果进行一些研究,但您可以随时在SO上发布模式,查询和查询分析,以帮助您优化性能低下的查询。我想你会发现Postgres社区非常有帮助并且急于帮助解决性能问题。