AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 266640
Accepted
Raidenlee
Raidenlee
Asked: 2020-05-07 17:16:20 +0800 CST2020-05-07 17:16:20 +0800 CST 2020-05-07 17:16:20 +0800 CST

索引的创建能否打破表依赖关系?

  • 772

我使用 , 运行了一个查询sys.dm_db_missing_index_details,sys.dm_db_missing_index_groups并sys.dm_db_missing_index_group_stats确定我对丢失索引的选择是什么。在分析数据后,我确定我需要为表 A 创建一个非聚集索引。

查看表 A,我注意到有 55 个依赖项(表、SP、视图)和 23 个依赖于该表的对象。我的问题是,如果我在这个表上创建这个非聚集索引,它会影响这个表的依赖项和依赖项吗?

此外,如果是的话,它会影响依赖关系,我什至如何尝试修复依赖关系?

sql-server index
  • 3 3 个回答
  • 257 Views

3 个回答

  • Voted
  1. LowlyDBA - John M
    2020-05-09T08:50:04+08:002020-05-09T08:50:04+08:00

    实现过滤索引时,某些连接设置必须正确:

    在此处输入图像描述

    否则

    数据库引擎生成错误并回滚更改索引中数据的 INSERT、UPDATE、DELETE 或 MERGE 语句。

    因此,如果任何依赖代码没有正确配置上述SET选项,添加过滤索引将破坏它们。不幸的是,在使用有问题的存储过程代码的旧系统上工作时,我不得不学习一种艰难的方法来仔细检查这一点:)

    • 4
  2. Best Answer
    Ronaldo
    2020-05-08T18:01:22+08:002020-05-08T18:01:22+08:00

    在可用的索引类型中,我只能看到一种能够导致依赖于表的对象出错的索引,它是唯一索引。

    根据唯一索引设计指南:

    唯一索引保证索引键不包含重复值,因此表中的每一行在某种程度上都是唯一的。

    它是一个带有约束的索引,可确保值是唯一的。除了那种非常具体的情况,你不必担心打破依赖,正如文档所说,

    非聚集索引是一种与存储在表中的数据分离的索引结构,它对一个或多个选定列进行重新排序。(强调我的)

    如您所见,非聚集索引与表分离,不会改变表本身的结构,因此,使用该表的任何内容都不会受到您害怕的负面影响。

    这是一个很好的起点:SQL Server 索引体系结构和设计指南


    实验室:通过创建索引导致表依赖错误

    首先,创建一个表,该表将有一个依赖于它的对象:

    CREATE TABLE MyTable(
        UserID INT NOT NULL IDENTITY PRIMARY KEY,
        Name VARCHAR(50) NOT NULL,
        Surname VARCHAR(50) NOT NULL
    )
    

    现在,创建一个依赖于该表的 SP:

    CREATE PROCEDURE InsertUser
    @Name VARCHAR(50),
    @Surname VARCHAR(50)
    AS
    BEGIN 
        INSERT INTO MyTable(Name, Surname)
        VALUES(@Name, @Surname);
    END
    

    让我们插入用户Paul Smith:

    EXEC InsertUser 'Paul', 'Smith';
    

    该过程执行良好。Paul 是一个非常常见的名称,现在您可以根据需要插入尽可能多的名为 Paul 的用户。但是您决定在列名称上创建一个唯一索引:

    CREATE UNIQUE INDEX AK_MyTable_Name ON MyTable (Name);
    

    之后,您尝试插入另一个名为Paul Jones的用户:

    EXEC InsertUser 'Paul', 'Jones';
    

    但是现在你得到一个错误:

    消息 2601,级别 14,状态 1,过程 InsertUser,第 6 行 [批处理开始第 17 行] 无法在具有唯一索引“AK_MyTable_Name”的对象“dbo.MyTable”中插入重复的键行。重复键值为 (Paul)。该语句已终止。

    依赖于该表的 SP 现在已损坏。这是我能想象的唯一一种情况,您可以通过创建索引来破坏依赖于表的对象。如果您现在不创建唯一索引,则可以放松并观察新索引的性能。

    • 2
  3. user1716729
    2020-05-07T23:51:07+08:002020-05-07T23:51:07+08:00

    非常简单的答案是否定的。但是,在创建索引之前,您必须了解工作量,表上当前有多少索引,是否可以通过修改现有索引来完成新索引等。

    切勿根据 SQL Server 缺失索引建议创建索引https://www.brentozar.com/archive/2017/08/missing-index-recommendations-arent-perfect/

    正如我在第 1 段中提到的,您需要通过分析使用统计数据来了解您的工作量和新索引的好处。

    • 1

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 如何确定是否需要或需要索引

  • RDBMS 上的“索引”是什么意思?[关闭]

  • 如何在 MySQL 中创建条件索引?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve