Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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
在SQL Server中按行或列保存记录_Sql_Sql Server_Sql Server 2008_Database Design_Database Performance - Fatal编程技术网

在SQL Server中按行或列保存记录

在SQL Server中按行或列保存记录,sql,sql-server,sql-server-2008,database-design,database-performance,Sql,Sql Server,Sql Server 2008,Database Design,Database Performance,我必须在一个表中保存三种文档类型。文档类型的数量是固定的,不会更改。有100多万条记录,未来可能超过1亿条。为此,性能在我的程序中非常重要。我不知道哪种方法可以提高数据库性能。基于行还是基于列 基于行的: CREATE TABLE [Person].[Document] ( [Id] [uniqueidentifier] NOT NULL, [PersonId] [uniqueidentifier] NOT NULL, [Document] [varbinary](max

我必须在一个表中保存三种文档类型。文档类型的数量是固定的,不会更改。有100多万条记录,未来可能超过1亿条。为此,性能在我的程序中非常重要。我不知道哪种方法可以提高数据库性能。基于行还是基于列

基于行的:

CREATE TABLE [Person].[Document]
(
    [Id] [uniqueidentifier] NOT NULL,
    [PersonId] [uniqueidentifier] NOT NULL,
    [Document] [varbinary](max) NULL,
    [DocType] [int] NOT NULL,
)
基于列的:

CREATE TABLE [Person].[Document]
(
    [Id] [uniqueidentifier] NOT NULL,
    [PersonId] [uniqueidentifier] NOT NULL,
    [Document_Page1] [varbinary](max) NULL,
    [Document_Page2] [varbinary](max) NULL,
    [Document_Page3] [varbinary](max) NULL,
)
规范化(或您称之为基于行的)解决方案更加灵活。
它允许您更改为每个人保存的文档数量,而无需更改数据库结构,通常是首选解决方案。
一百万行对于SQL server来说是一个小表。
我见过有5000万行的数据库表,它们的性能非常好。
这是一个正确索引的问题

我确实建议,如果您想要更好的性能,请使用一个int-identity列作为主键,而不是uniqueidentifier,因为它重量很轻,而且数据库更容易索引,因为它不是随机排序的


我会使用规范化解决方案。

您希望有多少文档页面?@TimBiegeleisen三个文档页面。您希望在
[document]
[DocType]上有索引吗
row-based schema中的列?如果您最多可以有3个页面,那么使用基于列的方法可以减少行数并易于操作数据,那么@ZoharPeled的解决方案可能是正确的,假设您已经为您的答案设置了这些索引。tnx,但是在本项目中,速度和性能比灵活性更重要。记录可以快速增长,在未来几年中可以超过1亿条记录。文档类型的数量是固定的,不会更改。性能取决于查询。如果您的大多数查询是“给我person x的所有文档”,那么选择“基于行”还是“基于列”其实并不重要。事实上,我不太确定我能想出一个查询,它在一种设计上的性能明显优于另一种设计(也就是说,如果您对表进行了适当的索引),每个文档最多只能有3页。因此,您看到的是表大小差异的3倍。这对您来说会是一个交易破坏者吗?我使用int-identifier列而不是uniqueidentifier进行分解,因为如果一个表上有1亿条记录,那么管理一个整数键将变得更加困难。Uniqueidentifier是在大型表中标识行的最佳方法。如果您经常使用PersonId选择数据,则基于列的存储是一个很好的解决方案。@Helio:存储在4个字节上,可以保存-2^31到2^31-1之间的值。这意味着,如果以(1,1)开始标识,则在int值用完之前,表中可以有
2147483647
记录。这比1亿美元还要多。存储在16字节上,与int相比没有明显的优势。如果索引正确,我认为每人返回3条记录或1条记录之间不会有太大区别。