按月和年创建 sql 个表
Creating sql tables by month and year
每个月我都会收到来自外部公司的文件,需要存储在数据库中,每个文件包含多达一百万条记录。主要数据字段是月、年、邮政编码和交易类型。
我提议我们应该每月将数据库中的数据保存为一个新的 SQL table,这样我们就知道每个 table 中的数据量是有限的.然而我的一位同事说他曾经被告知每月创建一个新的 table 是一种不好的做法,但他不知道为什么。
如果我有多个 tables,最多只有 60 个 tables,但可能会少得多(降至 12 个),具体取决于进入多远过去我的客户需要看。这意味着每个月我都需要删除一个月的数据。
然而,当我执行 SQL 查询时,每个查询只需要来自单个 table 的一行数据。我认为从理论上讲,这比用一个 table 填充数百万行更有效。
我想知道是否有人有明确的理由说明为什么以这种方式拆分数据是一件坏事?
一种更简单的方法是向 table 添加一列,其中包含加载到系统中的日期时间戳。这样您就可以按该特定列进行过滤,以将该数据分离到它加载的 months/years 中。
从性能角度来看的另一个优势是,如果您定期以这种方式过滤数据,则可以基于此日期列创建索引。
出于性能原因以及信息在 SQL 中的存储方式,不建议使用包含相同信息的多个 table。最终它会占用更多 space 并且如果一个月的数据需要引用另一个月的数据它将非常慢。
希望这对您有所帮助。
如果您认为管理您的应用程序并不困难,您可以做到。
例子。您是否需要每月更改 SQL 个查询?
如果用户需要更多需要 1 个月以上数据的报告,会发生什么情况?
使用 partitioning,DBMS 会将您的数据拆分为物理存储上的多个 table,但您可以使用相同的名称调用所有这些数据。 DBMS 将分析它应该采用的分区。性能没有显着差异。
所有 "like" 项目应一起存储在数据库中,原因如下:
您应该能够使用单个 SELECT
语句提供项目的任何子集,只需更改该语句的 WHERE
子句。对于单独的 table,您将不得不编写代码将请求分解为计算 table 名称的部分和过滤 table 的部分。您将不得不在每个应用程序中复制该逻辑,或者将其教授给每个想要使用您的数据库的用户。
您不应人为地限制您的数据的用途。如果您有单独的月度 table,那么您已经大大限制了可以针对它们输入的查询类型,而无需编写更复杂的 UNION
查询。
向您的数据库添加更多已知数据类型的实例不需要ALTER
调整您的数据库的结构,并且作为一般原则,定期-运行代码甚至不应该有ALTER
权限
如果维护适当的索引,当 SELECT
从 table 的数据是较小的 table 的 60 倍时,性能差异很小。 (对 INSERT
和 UPDATE
命令可能会有更多影响,但听起来您将进行批量更新而不是不断更新数据)。
我只能想到将数据分片到单独的 table 中的两个原因:
您发现性能问题无法通过更好的数据设计来解决。
您的记录具有不同的安全级别,并且依靠 GRANT SELECT
权限允许某些用户查看更高安全级别的记录。
每个月我都会收到来自外部公司的文件,需要存储在数据库中,每个文件包含多达一百万条记录。主要数据字段是月、年、邮政编码和交易类型。
我提议我们应该每月将数据库中的数据保存为一个新的 SQL table,这样我们就知道每个 table 中的数据量是有限的.然而我的一位同事说他曾经被告知每月创建一个新的 table 是一种不好的做法,但他不知道为什么。
如果我有多个 tables,最多只有 60 个 tables,但可能会少得多(降至 12 个),具体取决于进入多远过去我的客户需要看。这意味着每个月我都需要删除一个月的数据。
然而,当我执行 SQL 查询时,每个查询只需要来自单个 table 的一行数据。我认为从理论上讲,这比用一个 table 填充数百万行更有效。
我想知道是否有人有明确的理由说明为什么以这种方式拆分数据是一件坏事?
一种更简单的方法是向 table 添加一列,其中包含加载到系统中的日期时间戳。这样您就可以按该特定列进行过滤,以将该数据分离到它加载的 months/years 中。
从性能角度来看的另一个优势是,如果您定期以这种方式过滤数据,则可以基于此日期列创建索引。
出于性能原因以及信息在 SQL 中的存储方式,不建议使用包含相同信息的多个 table。最终它会占用更多 space 并且如果一个月的数据需要引用另一个月的数据它将非常慢。
希望这对您有所帮助。
如果您认为管理您的应用程序并不困难,您可以做到。
例子。您是否需要每月更改 SQL 个查询? 如果用户需要更多需要 1 个月以上数据的报告,会发生什么情况?
使用 partitioning,DBMS 会将您的数据拆分为物理存储上的多个 table,但您可以使用相同的名称调用所有这些数据。 DBMS 将分析它应该采用的分区。性能没有显着差异。
所有 "like" 项目应一起存储在数据库中,原因如下:
您应该能够使用单个
SELECT
语句提供项目的任何子集,只需更改该语句的WHERE
子句。对于单独的 table,您将不得不编写代码将请求分解为计算 table 名称的部分和过滤 table 的部分。您将不得不在每个应用程序中复制该逻辑,或者将其教授给每个想要使用您的数据库的用户。您不应人为地限制您的数据的用途。如果您有单独的月度 table,那么您已经大大限制了可以针对它们输入的查询类型,而无需编写更复杂的
UNION
查询。向您的数据库添加更多已知数据类型的实例不需要
ALTER
调整您的数据库的结构,并且作为一般原则,定期-运行代码甚至不应该有ALTER
权限如果维护适当的索引,当
SELECT
从 table 的数据是较小的 table 的 60 倍时,性能差异很小。 (对INSERT
和UPDATE
命令可能会有更多影响,但听起来您将进行批量更新而不是不断更新数据)。
我只能想到将数据分片到单独的 table 中的两个原因:
您发现性能问题无法通过更好的数据设计来解决。
您的记录具有不同的安全级别,并且依靠
GRANT SELECT
权限允许某些用户查看更高安全级别的记录。