Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用AWS快速划分100亿行SQL表?_Sql_Amazon Web Services_Amazon Redshift_Database Partitioning - Fatal编程技术网

如何使用AWS快速划分100亿行SQL表?

如何使用AWS快速划分100亿行SQL表?,sql,amazon-web-services,amazon-redshift,database-partitioning,Sql,Amazon Web Services,Amazon Redshift,Database Partitioning,我有一个以规范化格式交付的SQL数据数据库,其中有几个表包含数十亿行数据。我决定按itemId将大型表划分为单独的表,因为当我查询数据时,一次只关心一个项目。在对数据进行分区之后,我最终会有5000多个表。问题是,对数据进行分区大约需要25分钟才能为一个项目构建一个表 5000 items x 25 minutes = 86.8 days 将整个SQL数据库完全分区需要86天以上的时间。我的整个数据库大约有2.5TB 这是我可以利用AWS在项目级别上并行化的东西吗?我是否可以使用AWS数据库迁

我有一个以规范化格式交付的SQL数据数据库,其中有几个表包含数十亿行数据。我决定按itemId将大型表划分为单独的表,因为当我查询数据时,一次只关心一个项目。在对数据进行分区之后,我最终会有5000多个表。问题是,对数据进行分区大约需要25分钟才能为一个项目构建一个表

5000 items x 25 minutes = 86.8 days
将整个SQL数据库完全分区需要86天以上的时间。我的整个数据库大约有2.5TB

这是我可以利用AWS在项目级别上并行化的东西吗?我是否可以使用AWS数据库迁移服务以其当前形式托管数据库,然后使用AWS进程搅动所有5000个查询,将大表划分为5000个较小的表,每个表有2M行

如果不是,这是不是我必须投入更多的硬件才能让它运行得更快(CPU或RAM)


提前感谢。

这似乎不是一个好策略。首先,简单的算法是1000000000行,每个项目5000行,结果是表中有2000000个分区

红移限制(默认情况下)为:

亚马逊红移频谱在使用 Athena或AWS Glue数据目录:

  • 每个帐户最多10000个数据库
  • 每个数据库最多100000个表
  • 每个表最多有1000000个分区
  • 每个帐户最多有10000000个分区

您应该重新考虑分区策略。或者你的问题不适合红移。可能还有其他更适合您的用例的数据库策略。(然而,这不是推荐特定软件解决方案的论坛。)

为每个项目创建一个单独的表,其中表的所有其他属性保持不变,这似乎不符合逻辑。如果数据格式相同,则将数据保留在同一个表中,除非有特殊问题需要解决

如果将
itemId
设置为红移表上的
SORTKEY
,则红移将能够跳过不包含所需值的块(使用
时,其中itemId='xxx'
)。这将是高效的


诚然,试图保持如此大的表的排序可能太难
真空
。如果没有
SORTKEY
,它仍然可以正常工作,因为仍然可以跳过块,但效率不高,因为
itemId
的数据将分布在更多的块上。

使用itemId作为
SORTKEY
distkey
。如果表正确地设置为
vacumm
ed,并且您选择了一个itemid,这应该会有很好的结果,其中访问时间几乎与单个表一样好
distkey
用于在碎片之间分发数据,这意味着每个itemid的块将一起存储在同一个碎片上,从而使检索所有块更快。将itemid也设为
sortkey
意味着对于在同一个分片上存在的行数较小的itemid,在一个分片上查找表块中的行将尽可能快。

澄清一下,它将是5000个分区,每个分区有2000000行。@quantcoder。您的示例估计值引用了5000行,这就是该估计值的来源。对不起,我的意思是5000 itemID不是行。单个itemID可以引用这个表中的数百万行。具体来说,我处理的是公司的财务数据,其中5000代表我数据库中的特征数量。我有超过40000家公司20多年的历史数据。当我在数据库中查询所有公司的单个时间点的单个特征时,这需要很长时间。如果我按特征划分大表,我的查询会显著改进。但是,按特征对表进行分区仍然需要25分钟。@quantcoder。时间也通常用于分区。但是你说的有道理。如果你使用一个简单的RDS(当然,是一个合理的机器),那么一个合适的索引对整个数据集不起作用吗?这听起来有点像一个例子,你已经想出了一个解决方案,而不是一个问题。请具体说明你的意思。什么是“SQL数据库”是红移?(红移在内部不进行分区)如果您使用的是红移频谱/athena,那么您可以将数据发布到s3存储桶中,但这些存储桶通常相当大。最重要的是你在尝试什么?用例是什么?数据现在在哪里?您试图克服哪些问题?当前的SQL数据库是SQL Server 2016。用例是从这个表中提取一个项目的数据需要很长的时间,因此我尝试将非常大的表按项目划分为多个表,因为我总是一次只需要一个项目。当我说长时间时,我的意思是查询需要几分钟,但是如果我想提取这些数据来构建项目的完整历史记录(操作数据),可能需要几周的时间。如果我按项对其进行分区,查询将减少到毫秒而不是分钟。但分区仍然需要很长时间。更具体地说,我是在股票级别上查看财务数据的。我有一个巨大的价值表,代表公司的特点。我有大约4万家公司和大约5000个特征。此外,该数据库高度规范化,因此实际的公司名称和日期位于其他表中。我一次只想看一个特性,因此按特性将大表划分为单独的表会产生5000个表,每个表都包含该特性的所有公司的历史数据