Search code examples
sqlsql-serversql-server-2008database-designdatabase-performance

Save records in rows or columns in SQL Server


I have to save three document types in a table. number of document types is fixed and will not change. there is more than 1 million records and in the future it can be more than 100 millions. for this purpose performance is so important in my program. I don't know which way can improve the database performance. row-based or column based?

Row-Based:

CREATE TABLE [Person].[Document]
(
    [Id] [uniqueidentifier] NOT NULL,
    [PersonId] [uniqueidentifier] NOT NULL,
    [Document] [varbinary](max) NULL,
    [DocType] [int] NOT NULL,
)

Column-based:

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,
)

Solution

  • The normalized (or as you called it - row based) solution is more flexible.
    It allows you to change the number of documents saved for each person without changing the database structure, and usually is the preferred solution.
    A million rows is a small table for SQL server.
    I've seen database tables with 50 million rows that performs very well.
    It's a question of correct indexing.

    I do suggest that if you want better performance use an int identity column for your primary key instead of a uniqueidentifier, since it's very light weight and much easier for the database to index because it's not randomly ordered to begin with.

    I would go with the normalized solution.