0

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

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

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

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

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

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";

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

4

2 回答 2

3

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

只有在极少数情况下,您才会将数据分成不同的表。我能想到的唯一一个是用户要求他们的数据与其他任何人的数据分开存储。

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

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

于 2013-06-12T19:22:25.560 回答
1

您没有提供足够的信息来给出非常详细的答案,但我不会公开表示您很可能需要/想要一张桌子。性能将取决于这里列出的太多东西(硬件、配置等),但 PostgreSQL 应该没有 8M 行的问题。如果您正确索引它,将会看到更好的性能。为此,请确保在 pgAdminIII 中编写查询并使用分析功能。您将需要对如何解释结果进行一些研究,但您始终可以在 SO 上发布您的架构、查询和查询分析,以帮助您优化性能不佳的查询。我认为您会发现 Postgres 社区非常有帮助并且渴望帮助解决性能问题。

于 2013-06-12T19:27:39.800 回答