如何提高性能

时间:2018-10-18 08:31:56

标签: sql sql-server

我具有以下表结构:

CREATE TABLE [dbo].[TableABC](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [FieldA] [nvarchar](36) NULL,
    [FieldB] [int] NULL,
    [FieldC] [datetime] NULL,
    [FieldD] [nvarchar](255) NULL,
    [FieldE] [decimal](19, 5) NULL,
PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

我对此表执行两种类型的CRUD操作。

  1. SELECT * FROM [dbo].[TableABC] WHERE FieldA = @FieldA
  2. INSERT INTO [dbo].[TableABC](FieldA,FieldB,FieldC,FieldD,FieldE) VALUES (@FieldA,@FieldB,@FieldC,@FieldD,@FieldE)

FieldA具有唯一值,但是表中没有约束。

当前表中有 6070755 行。随着数据的增长,性能越来越慢。 有什么建议,如何提高性能?如何使CREATE和READ操作更快?

现在我面临问题,即选择和插入的时间太长,有时超过60秒

2 个答案:

答案 0 :(得分:0)

执行以下操作:

-- ALTER TABLE [dbo].[TableABC] ALTER COLUMN [FieldA] UNIQUEIDENTIFIER NOT NULL;

ALTER TABLE [dbo].[TableABC] ADD CONSTRAINT UQ_TableABC UNIQUE ([FieldA]);
-- or
-- CREATE UNIQUE NONCLUSTERED INDEX [IX_UQ_NC_TableABC_FieldA] ON [dbo].[TableABC]([FieldA]);

选择是这里的主要问题,请记住,由于您执行了如此长的操作,因此将遭受锁定。

同样,如前所述,请阅读一些有关关系数据库的基础知识,您只会从中受益。

答案 1 :(得分:-1)

阅读有关SQL基础的知识-索引肯定是其中之一。而且,如果您具有唯一值,并且字段上没有索引(约束无关紧要,则唯一索引就足够了)-是的,这样会变慢。 SQL Server必须检查整个表。

所以:

  • 向字段a添加唯一索引。

给出2条语句和小写的“ FieldA具有唯一值,但表中没有约束。”我假设您尝试通过首先选择在其中强制执行唯一值。这会使您减速。

改为建立索引,然后尝试/捕获非唯一的SQL错误-更快。更快。索引会使插入LITTLE的速度变慢,但是您可以保存非常慢的选择而不必完全保留。