首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要建议的指标:高价值缺失指数高影响。当索引已经存在时

需要建议的指标:高价值缺失指数高影响。当索引已经存在时
EN

Database Administration用户
提问于 2020-12-01 08:04:09
回答 2查看 485关注 0票数 0

当我已经有索引时,我正试图理解这个特定表缺少索引的真正含义,以及如何处理它。

我有一个使用率很高的表,它的容量约为2.5GB。由于它被大量使用,所以对于创建不太需要的索引有点犹豫(有争议)。此表以前是堆的,最近在将主键从非群集更改为聚集后,它被更改为表。

当我使用数据库名或这个表运行sp_blitzindex时,它会给出如下结果:

它主要建议在APT_ID列上创建索引,并包含建议LOGID、RECEIVE_TIME和其他几个列。如果我们查看表定义,主键是在LOGID和RECEIVE_TIME中定义的。并且在APT_ID列上有一个NC索引。

表DDL如下:

代码语言:javascript
复制
CREATE TABLE [dbo].[TXN_LOG](
    [LOGID] [int] IDENTITY(1,1) NOT NULL,
    [RECEIVE_TIME] [varchar](15) NOT NULL,
    [APT_ID] [int] NOT NULL,
    [VAR32_01] [varchar](32) NULL,
    [VAR32_02] [varchar](32) NULL,
    .
    .
    .
    [ERROR_CODE] [varchar](20) NULL,
    [MESSAGE_ID] [varchar](40) NULL,
    [END_POINT_ID] [varchar](50) NULL,
    [NODE_ID] [varchar](40) NULL,
    [TIMEOUT_NETWORK_ID] [int] NULL,
    [TXN_SUMMARY] [numeric](1, 0) NULL,
    [D_FLAG] [numeric](1, 0) NULL,
     CONSTRAINT [PKTXN_LOG] PRIMARY KEY CLUSTERED 
    (
        [LOGID] ASC,
        [RECEIVE_TIME] ASC
    ))
GO

本表的NC索引是:

代码语言:javascript
复制
CREATE NONCLUSTERED INDEX [IDX_TXN_LOG_1] ON [dbo].[TXN_LOG]
(
    [APT_ID] ASC
)
INCLUDE([RECEIVE_TIME]) 
GO

索引的当前使用似乎不支持NC索引,因为写入高于读计数。

为在问题中附加图片表示诚挚的歉意。如果我能在这方面得到一些专家的建议,非常感谢。提前谢谢。

版本: Microsoft 2014 (SP3-GDR) (KB4532095) - 12.0.6118.4 (X64) 2019年12月12日21:46:15版权(c)微软公司企业版:基于核心的授权(64位)在Windows 6.3 (Build 9600:) (Hypervisor)

EN

回答 2

Database Administration用户

回答已采纳

发布于 2020-12-01 10:45:16

为了澄清和简化你的问题:

  • 您已经拥有的索引在LOGID,接收_时间上。
  • Server正在请求APT_ID上的索引,它希望您包含LOGID、RECEIVE_TIME

这确实是一个与你已经拥有的不同的指数。

让我们以电话簿的老例子为例。电话簿的白色页在LAST_NAME,FIRST_NAME,MIDDLE_NAME上。如果您运行这样的查询,那就太好了:

代码语言:javascript
复制
SELECT *
FROM PHONE_BOOK
WHERE LAST_NAME = 'OZAR'

但如果你不知道某人的姓,你就问这个:

代码语言:javascript
复制
SELECT *
FROM PHONE_BOOK
WHERE FIRST_NAME = 'BRENT'

然后你要扫描整个电话簿来找我。索引中的第一列非常重要。这就是为什么Server要求在APT_ID上建立索引,以及包含其他列的原因。

因此,您可能会问,“为什么仅在APT_ID上建立一个现有索引还不够呢?”问题是,在您的情况下,APT_ID没有足够的选择性,或者人们要求范围的APT_IDs。Server需要进行大量的关键查找,缺少的索引建议正在尝试删除这些索引建议。

票数 2
EN

Database Administration用户

发布于 2020-12-01 08:29:39

什么都说不出来,因为缺少指数太蠢了。

首先,它不考虑选择性。如果只返回几行,那么拥有一个不包含查询的索引就可以了。但是MI并不关心选择性,所以它希望涵盖每个查询。它可以提出(a)包括(b,c)的一个指数和(a)包括(b,c,d)的另一个指数。也就是说,没有聪明(这是因为它不想花太多的时间来提出这些建议)。

创建支持查询的索引。

打开查询存储并从那里工作。

或者创建索引,并在一段时间后查看它们是否被使用。

或者,如果您知道您的查询负载,那么使用这些查询。

也许我在你的帖子中遗漏了一些关键点,那么请告诉我。:-)

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

https://dba.stackexchange.com/questions/280639

复制
相关文章

相似问题

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