如何在SQL中设计用于表数据搜索的表结构变得更快

时间:2018-10-16 07:02:54

标签: sql sql-server sql-server-2008 asp.net-mvc-5 key

主表结构

 CREATE TABLE [dbo].[Timetable] (
    [location]                   NVARCHAR (128) NOT NULL,   
    [term]                       NVARCHAR (128) NOT NULL,
    [employeeId]                 BIGINT         NOT NULL,    
    [subjectCode]                NVARCHAR (128) NOT NULL, 
    [lectureComment]             NVARCHAR (MAX) NULL,
    [lectureDate]                DATE           NOT NULL,

   CONSTRAINT [PK_dbo.Timetable] 
   PRIMARY KEY CLUSTERED ([location] ASC,  [term] ASC, [employeeId] ASC, [subjectCode] ASC));

此表有超过40万行

我想将所有行的备份保存到另一个数据库中,并包括存储“ AcademicYear”列和“ Academy Year”列的

TimetableBackup结构

  CREATE TABLE [dbo].[TimetableBackup] (
    [academicYear]               NVARCHAR (128) NOT NULL, 
    [location]                   NVARCHAR (128) NOT NULL,   
    [term]                       NVARCHAR (128) NOT NULL,
    [employeeId]                 BIGINT         NOT NULL,    
    [subjectCode]                NVARCHAR (128) NOT NULL, 
    [lectureComment]             NVARCHAR (MAX) NULL,
    [lectureDate]                DATE           NOT NULL,

   CONSTRAINT [PK_dbo.TimetableBackup] 
   PRIMARY KEY CLUSTERED ([location] ASC,  [term] ASC, [employeeId] ASC, [subjectCode] ASC));

TimetableBackup 表的结构应该是什么,以便我可以将 academicYear 的数据存储为主列,以便以后的表数据搜索变得更快?

1 个答案:

答案 0 :(得分:3)

为了通过acadamicYear优化搜索,您可以执行以下步骤:

  • 使用以下结构创建查找表年份:

     [academicYearID] SMALLINT
    ,[acadamicYear] NVARCHAR(128)
    

    在备份表中,改用整数列

  • 在备份表的academicYearID列上创建了一个索引-索引将很小(但它包含PK存储空间以引用原始表,因此此处是相对的); < / p>

具有这样的索引可以在引擎决定使用索引来查找记录然后对原始表进行查找时优化特定的搜索查询。

可以将此逻辑应用于原始表字段吗?

以下几列是您的PK的一部分:

[location]                   NVARCHAR (128) NOT NULL   
[term]                       NVARCHAR (128) NOT NULL
[employeeId]                 BIGINT         NOT NULL    
[subjectCode]                NVARCHAR (128) NOT NULL

将此字段视为需要引擎读取的数据。您可以尝试对表格进行更多标准化。您有一个存储员工的表,对吗?您为什么不为位置,术语,主题代码创建此类表?结果,您可以拥有包含四个整数的PK,这将比当前整数好得多。

拥有此类PK可以优化您的读取操作,因为将要读取小数据。它将也改善其他索引的大小(从那里您可以再次进行少量读取并提高查询速度)。