首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL性能建议

SQL性能建议
EN

Stack Overflow用户
提问于 2018-03-21 13:52:11
回答 2查看 39关注 0票数 0

我知道,这可能是一个棘手的问题,它在很大程度上取决于环境。

我有一个包含大约1000万行(每行包含4个varchar)的表。在用于where的字段( varchar)上有一个非聚集索引。

我有点困惑,因为在索引列上使用where来选择一行时,大约需要一秒的时间才能结束。

有什么建议可以改善这个响应时间吗?在这里,索引集群是一个很好的解决方案吗?

以下是表的定义:

代码语言:javascript
复制
CREATE TABLE [dbo].[MYTABLE](
[ID] [uniqueidentifier] NOT NULL DEFAULT (newid()),
[CreationDate] [datetime] NOT NULL DEFAULT (getdate()),
[UpdateDate] [datetime] NULL,
[FIELD1] [varchar](9) NOT NULL,
[FIELD2] [varchar](max) NOT NULL,
[FIELD3] [varchar](1) NULL,
[FIELD4] [varchar](4) NOT NULL,
CONSTRAINT [PK_MYTABLE] 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] TEXTIMAGE_ON [PRIMARY]

以下是索引定义:

代码语言:javascript
复制
CREATE UNIQUE NONCLUSTERED INDEX [IX_FIELD1] ON [dbo].[MYTABLE]
(
[FIELD1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

下面是我使用的查询(非常基本):

代码语言:javascript
复制
SELECT * FROM MYTABLE WHERE FIELD1 = 'DATA'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-21 14:38:50

在这种情况下,由于选择了所有列(*),因此将非聚集索引更改为聚集索引将缩短时间,因为从非聚集索引访问其他列(未包含在索引中,也不包括在索引中,也不按INCLUDE排序)将需要使用实际数据检索另一个页面。

由于每个表的聚集索引不能超过一个,所以必须删除现有索引(在本例中为PRIMARY KEY ),然后创建它。

代码语言:javascript
复制
ALTER TABLE dbo.MYTABLE DROP [PK_MYTABLE] -- This might fail if you have foreign keys

ALTER TABLE dbo.MYTABLE ADD CONSTRAINT PK_MYTABLE PRIMARY KEY NONCLUSTERED (ID) 

DROP INDEX [IX_FIELD1] ON [dbo].[MYTABLE]

CREATE CLUSTERED INDEX [IX_FIELD1] ON [dbo].[MYTABLE] (FIELD1)

索引访问时间也可能因其碎片而有很大的差异(如果有许多插入、删除或更新的值不大于或低于前一个/第一个)。

还请记住,如果您正在执行其他操作,如联接、函数调用或附加的WHERE过滤器,则引擎可能决定不使用这些索引。

票数 1
EN

Stack Overflow用户

发布于 2018-03-21 14:38:40

如果确定WHERE子句中使用的列是唯一的,则可以在该列上创建唯一聚类索引

如果该列中的值不是唯一的,则可以实现覆盖指数。例如,如果您有这个索引:

代码语言:javascript
复制
CREATE NONCLUSTERED INDEX IX_Column4 ON MyTable(Column4)
INCLUDE (Column1, Column2);

执行下列查询时:

代码语言:javascript
复制
SELECT Column1, Column2 FROM MyTable WHERE Column4 LIKE 'Something';

您将(很可能)使用IX_Column4索引。但在执行以下内容时:

代码语言:javascript
复制
SELECT Column1, Column2, Column3 FROM MyTable WHERE Column4 LIKE 'Something';

你将不会受益于这种指数所提供的优势。

如果表中的行是反式INSERTED, DELETED or UPDATED,则应检查它们是否为索引碎片和重建或重新组织

如果您想了解更多关于索引的内容,我推荐以下文章:

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49408178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档