sql-server - 表分区与多个表

标签 sql-server

假设我们有一个巨大的表,我们在上面运行非常复杂的查询。

假设这是一个 crm,我们有一个名为 People [id (GUID), listId (Guid), name, email, city, ......] 的表

将其表示为每个用户多个表会更好吗:

People_<USER_ID>如果我们有 100 个用户,我们就有 100 个这样的表

或者

像上面这样的一个表,带有我们分区的 user_id 列?

最佳答案

每种方法都有优点和缺点。

例如,如果您使用单独的表,您可以单独对每个表进行重建索引或统计等维护,如果添加新用户,则创建新表很简单,而不用修改分区函数。

使用分区表,查询会得到极大简化,因为您不再依赖对每个单独的表使用 UNION 的查询。

中途地面是使用分区 View ;即构建一个 View ,该 View 具有联合在一起的各个表的定义。这提供了分区表的一些优点,但是如果添加新表,则 View 定义将需要维护,并且对于 100 个表来说,将非常笨重。

分区表通常最适合在数据仓库类型的环境中使用,您可以在其中拥有一个加载表,并将其添加为每次加载数据的新分区。在此环境中,您通常只在定义的时间将数据写入一个分区,并在其余时间从所有分区读取数据。

如果您的数据量非常大,那么分区可以在执行维护任务所需的时间方面提供一些好处(如果仅在一个或几个分区上需要这些任务)。然而,最好找到一个能适应这种情况的配分函数。例如,如果您的行写入一次并且未更新,则添加创建的日期时间并对其进行分区,或者使用递增主键并对其进行分区,这意味着您只需要重新索引事件分区。

关于sql-server - 表分区与多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30617262/

相关文章:

mysql - 使用子查询使用同一个表中的值更新表

sql - 获取分隔列中的最大日期(月和年)

sql-server - 如何查找单个存储过程中是否存在表名列表?

sql-server - sql loader- 带回车、换行的文件用 cr/lf 加载到 oracle

SQL Server - 检查约束 - 没有子查询?

c# - 从 .NET 安全地获取下一个 SQL Server 序列值

sql - 当相关行可能不存在时从连接表中进行选择

sql-server - SSIS无法在OnTaskFailed事件处理程序上移动文件

sql-server - 使用带参数的 DISTINCT 时 select 语句性能下降

c# - 系统无效操作异常