【问题标题】:how to design table structure for table data searching become faster in sql如何为表数据搜索设计表结构在sql中变得更快
【发布时间】:2019-03-20 15:28:24
【问题描述】:

主表结构

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

这个表有超过 400k 行

我想将所有行备份到另一个数据库,并包括 AcademicYear 列,该列存储数据与学年列

时间表备份结构

  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 数据存储为主列,以便以后的表数据搜索变得更快?

【问题讨论】:

  • 这实际上取决于您执行的搜索类型 - 按哪些列搜索、提取哪些列、给定搜索返回的行数。您可能需要针对不同的搜索应用不同的衡量标准,但首先需要提供更多详细信息。
  • 搜索全部取决于表的主键或 AcademicYear。如何存储使用列 AcademicYear 分隔的数据
  • 请不要在这里使用像“十万”这样的印度词。其他国家的人不会理解的。
  • 你的表不是真正的备份,而是时间表的历史?这样另一个表包含当前数据,而另一个表包含旧数据?

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


【解决方案1】:

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

  • 创建具有以下结构的查找表年份:

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

    在您的备份表中,改用整数列

  • 在备份表中的academicYearID 列上创建了一个索引 - 索引会很小(但它包含 PK 存储以引用原始表,因此这里的大小是相对的);

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

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

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

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

将此字段视为需要由引擎读取的数据。您可以尝试更多地规范化您的表格。你有一张存放员工的桌子,对吧?为什么不为位置、术语、主题代码创建这样的表格?结果,您可以使用四个整数进行 PK,这将比当前的整数更好。

拥有这样的 PK 将优化您的读取操作,因为将读取小数据。它也将提高其他索引的大小(从那里您再次获得小读取和更快的查询)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2013-02-17
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2011-08-18
    相关资源
    最近更新 更多