改进在sql中插入表的性能

时间:2015-03-16 12:12:01

标签: sql-server stored-procedures database-performance

在这个层面上有一些令我困惑的事情。

我有一个包含大约40列的表,其中至少有35个列在where子句中,在单个执行过程的不同时间。

当这35个列通过存储过程传递一个值时,存储过程调用它们各自的内联TVF,然后调用一个公共多行TVF。

  1. 我需要知道我是否会考虑为所有这35个列创建索引(虽然我有严重的疑问,如果它可以帮助,但请告诉我,如果它有错误。)

  2. 我正在将数据插入临时表。此插入继续传递给存储过程的参数数量,执行计划显示它需要相当长的时间。有没有办法可以改善这里的表现?

  3. 插入查询如下所示:

       INSERT INTo #Temp2
     (RowNumber,ValFromUser,ColumnName,ValFromFunc,FuncWeight,percentage) 
    SELECT RowNumber,@firstname,'firstname',PercentMatch,
    @constVal,PercentMatch * @constVal FROM   dbo.MatchFirstName(@firstname)
    

    : 执行计划附后:

    execution plan

    具有大量列的表如下:

    create table Patients
    (
    Rowid int identity(1,1),
    firstname nvarchar(20) not null,
    middlename nvarchar(20),
    lastname nvarchar(20)not null,
    DOB Date,
    SSN nvarchar(30), 
    ZIP nvarchar(10),
    [State] nvarchar(2),
    City nvarchar(20),
    StreetName nvarchar(20),
    StreetType nvarchar(20),
    BuildingNumber int,
    Aptnumber nvarchar(10),
    patientnickname nvarchar(20),
    patientsMaidenlastname nvarchar(20), 
    fathersFirstName nvarchar(20), 
    fatherslastname nvarchar(20), 
    mothersfirstname nvarchar(20), 
    motherslastname nvarchar(20), 
    mothersMaidenlastname nvarchar(20),
    citizenship nvarchar(20),
    nationality nvarchar(20), 
    ethnicity nvarchar(20), 
    race nvarchar(20), 
    religion nvarchar(20),
    primarylanguage nvarchar(20),
    patientmrn nvarchar(30),
     hospitalname nvarchar(30), 
     Medicaidid nvarchar(10), 
     pcpnpi  nvarchar(10), 
     phonenumber nvarchar(15),
     email nvarchar(30),
     CreatedAt datetime default getdate(),
     ModifiedAt datetime DEFAULT getdate(),
     CreatedBy nvarchar(128) default SUSER_NAME(),
     ModifiedBy nvarchar(128) default SUSER_NAME()
    );
    

    临时表如下所示:

    create table #Temp2
    (
    Rownumber int not null,
    ValFromUser nvarchar(30),
    ColumnName nvarchar(30),
    ValFromFunc decimal(18, 4),
    FuncWeight decimal(18, 4),
    Percentage decimal(18, 4) not null,
    
    );
    

    ResultsStored table:

    create table ResultsStored
    (
    Sno int identity(1,1),
    SearchSerial int,
    StringSearched varbinary(8000),
    RowId int,
    PercentMatch decimal(18,4),
    CreatedAt datetime default getdate(),
    ModifiedAt datetime default getdate(),
    CreatedBy nvarchar(128) default SUSER_Name(),
    ModifiedBy nvarchar(128) default SUSER_NAME(),
    HashedKey binary(16) 
    );
    

1 个答案:

答案 0 :(得分:0)

  1. 索引加速(有时)SELECT。但索引会减慢INSERT(以及DELETE,UPDATE等)。因此,拥有太多索引是一个坏主意。

  2. SELECT通常只能使用一个索引(甚至零)。因此所有其他34个指数都无济于事。只保留你的SELECT真正使用的那些。

  3. 正如您所说,在 distinct ' WHERE' -clauses中,您在表格中有大约40列,其中至少有35列。这是你的桌子不仅大,但更糟糕的是,它有太多潜在的钥匙。这是一个非常糟糕的设计。您需要将其拆分为多个表。阅读关于规范化的内容。