是否需要索引短字符串代码以加快查询速度?

zer*_*law 3 index sql-server linq

我们有大量用于设置表格的表格。在每个表格中,都需要填写CodeDescription

代码由varchar(10)数据类型组成。

现在,问题是,每次用户创建新数据或更新数据时,都需要检查是否Code与其他人发生冲突。

在 LINQ 中,这种代码检查是不可避免的:

string ExistingCode = "ITEM01";
int ExistingKey = 1;

var recordWithConflictedCode = (from a in db.MyTable
                               where a.Code == ExistingCode && 
                               a.Key != ExistingKey).ToList();

if(recordWithConflictedCode.Count >= 1)
    return BadRequest("Duplicated Code found");
Run Code Online (Sandbox Code Playgroud)

现在,由于这涉及对每个进程的字符串比较,我认为对列Code进行索引以使查询更快是有意义的。

这对你们来说是一种常见的做法吗?

Han*_*non 5

将 DBMS 用于其预期目的;即在表上创建约束,使其符合业务规则。

设计您的表,使其看起来像:

USE tempdb;
CREATE TABLE dbo.MyTable
(
    [Key] int NOT NULL
    , Code varchar(10) NOT NULL
         CONSTRAINT uq_MyTable_Code
         UNIQUE 
);
Run Code Online (Sandbox Code Playgroud)

这将确保插入的每一行MyTable都有一个唯一的Code列。现在,您可以try ... catch在 .Net 代码中围绕您的插入添加一条语句,以在检测到重复项时通知用户。

SQL Server 引擎将自动在表上创建唯一索引以支持约束。您可以手动在表上创建唯一索引以满足相同的要求;但是,以上面详述的方式将其添加为唯一约束以自我记录业务规则。

  • 我不知道@Max,我发现除非你有一个*非常*高的成功率(例如很少有冲突),你的批处理可以通过让 SQL Server 调用错误处理而不是阻止错误来*更长的时间*通过检查自己。请参阅[此处](https://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/)和[此处] (https://sqlperformance.com/2012/08/t-sql-queries/error-handling)。如果应用程序必须检查错误然后执行不同的操作,从而导致额外的往返行程,则尤其如此。 (2认同)