我具有以下表结构:
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操作。
SELECT * FROM [dbo].[TableABC] WHERE FieldA = @FieldA
INSERT INTO [dbo].[TableABC](FieldA,FieldB,FieldC,FieldD,FieldE) VALUES (@FieldA,@FieldB,@FieldC,@FieldD,@FieldE)
FieldA具有唯一值,但是表中没有约束。
当前表中有 6070755 行。随着数据的增长,性能越来越慢。 有什么建议,如何提高性能?如何使CREATE和READ操作更快?
现在我面临问题,即选择和插入的时间太长,有时超过60秒
答案 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必须检查整个表。
所以:
给出2条语句和小写的“ FieldA具有唯一值,但表中没有约束。”我假设您尝试通过首先选择在其中强制执行唯一值。这会使您减速。
改为建立索引,然后尝试/捕获非唯一的SQL错误-更快。更快。索引会使插入LITTLE的速度变慢,但是您可以保存非常慢的选择而不必完全保留。