删除主键(聚集索引)以提高插入性能

2024-02-09

我们一直在经历 SQL 超时,并已确定该瓶颈是审核表 - 我们系统中的所有表都包含插入、更新和删除触发器,这些触发器会导致新的审核记录。

这意味着审计表是系统中最大且最繁忙的表。然而数据只进入,永远不会出来(在这个系统下)所以没有select需要性能。

运行一个select top 10返回最近插入的记录而不是“第一”记录。order by当然可以,但我希望选择顶部应该根据光盘上的顺序返回行 - 我希望这会返回最低的 PK 值。

有人建议我们放弃聚集索引,实际上也放弃主键(唯一约束)。正如我之前提到的,没有必要select从这个系统内的这个表。

聚集索引会对表造成什么样的性能影响?拥有无索引、非集群、无键表会产生哪些(非选择)后果?还有其他建议吗?

edit

我们的审计涉及 CLR 函数,我现在正在使用和不使用 PK、索引、FK 等进行基准测试,以确定 CLR 函数和约束的相对成本。

经调查,业绩不佳与insert语句而不是编排审计的 CLR 函数。删除 CLR 并使用直接的 TSQL 过程后,性能提高了 20 倍。

在测试过程中,我还确定聚集索引和标识列对插入时间几乎没有影响,至少相对于发生的任何其他处理而言是这样。

// updating 10k rows in a table with trigger

// using CLR function
PK (identity, clustered)- ~78000ms
No PK, no index - ~81000ms

// using straight TSQL
PK (identity, clustered) - 2174ms
No PK, no index - 2102ms

根据索引女王 Kimberly Tripp 的说法,在表上拥有聚集索引实际上有助于提高 INSERT 性能:

聚集索引争论仍在继续

  • 在聚集表中插入速度更快(但仅限于“右” 聚簇表)与堆相比。这里的主要问题是 在 IAM/PFS 中查找以确定堆中的插入位置 比聚簇表慢(其中插入位置已知, 由聚集键定义)。插入时插入速度更快 定义顺序 (CL) 以及该顺序所在的表 不断增加。

来源:博客文章名为聚集索引争论仍在继续...... http://sqlskills.com/BLOGS/KIMBERLY/post/The-Clustered-Index-Debate-Continues.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除主键(聚集索引)以提高插入性能 的相关文章

  • 包含 SqlGeometry 的数据表导致存储过程执行失败...为什么?

    我正在尝试保存一系列SqlGeometry值到 SQL Server 2008 数据库 基本上我在 SQL Server 存储过程中有一个表类型 如下所示 CREATE TYPE dbo TableType Example AS TABLE
  • LINQ + TransactionScope 不会更改 SQL Server Profiler 中的隔离级别

    我使用以下格式通过 linq 提交对数据库的更改 Begin Transaction Scope Serialized Required Check Business Rule 1 N MyDataContext SubmitChanges
  • 消息传递功能创建 Sql 查询和数据库视图

    鉴于以下情况 我需要能够获取给定用户参与的所有线程的列表 首先按最新消息排序 仅显示最新消息 每个线程 1 条消息 这是上面的 SQL 查询 SELECT Message MessageId Message CreateDate Messa
  • Flask-SQLAlchemy .count() 和 .all() 的记录计数不同

    在 SQLAlchemy 中 ModelName query filter by field name value count 返回正确的记录数 但是ModelName query filter by field name value al
  • SQL Server 2008 FileStream 与普通文件

    我正在创建一个像 youtube 这样的应用程序来存储视频 我需要一些建议 我应该使用 SQL Server FileStream 来存储视频文件 还是应该将它们存储在硬盘上的某个位置并将路径记录为 SQL Server 内的 varcha
  • TSQL 多列唯一约束也允许多个 Null

    我目前正在做一些从 MS Access 到 SQL Server 的迁移 Access 允许唯一索引中存在多个 Null 而 SQL Server 不允许 我一直在通过删除 SQL Server 中的索引并添加筛选索引来处理迁移 CREAT
  • 条件中的 T-SQL USE 语句

    看来USE语句是由MS SQL Server 2008R2编译的 例如 if 1 0 begin USE MyDB end 结果将在执行中USE MyDB同时忽略 IF 语句 如何改变它以适应条件 附 也尝试过execute sp exec
  • 良好的安全实践和自动身份范围管理是否相互排斥?

    我正在尝试使用自动身份范围管理 http msdn microsoft com en us library ms152543 aspx sectionToggle1 但是 确保我的用户可以在具有标识列的表中插入记录的唯一方法是使它们db o
  • 在 SQL 中搜索 xml 列中的多个值

    这是我的桌子 BasketId int BasketName varchar BasketFruits xml 1 Gold
  • 声纳+MS SQL数据库

    我正在尝试使用 mssql 服务器数据库初始化声纳 但我不能 使用 Microsoft SQL Server Management Studio 我创建了用户名 sonar 和密码 sonar 的用户 并向同时创建的 sonar 数据库授予
  • 当键是复合键时,metaData.getPrimaryKeys() 返回单行

    我在使用 SQLite 驱动程序的 JDBC 中遇到复合主键问题 The getPrimaryKeys 方法从DatabaseMetaData当我验证该键实际上是由两列组成的复合键时 对象返回单行 有人对如何检索主键的真实列表有任何建议 替
  • 将数据表传递给存储过程

    我有一个用 C 创建的数据表 using DataTable dt new DataTable dt Columns Add MetricId typeof int dt Columns Add Descr typeof string dt
  • SQL Server 2008 XPath

    我们尝试根据我们提供的值过滤一组 XML 我们的数据库的 XML 字段中有以下 XML 如果传递数字 5052095050830 我们需要在 XML 中找到这个特定节点 我们提供的号码可能存在任意多次 任何机构都可以提供一些 SQL 示例来
  • 数据库不存在。确保名称输入正确

    为什么我会出现这个错误 如果您查看屏幕截图 您将看到数据库 仅当我连接到两个数据库引擎时才会发生这种情况 它仅检测下面数据库引擎中的数据库 而不检测突出显示的数据库 除了关闭应用程序并仅打开一个数据库引擎之外 还有其他方法可以使用我的数据库
  • SQL:将现有列设置为 MySQL 中的主键

    我有一个包含 3 列的数据库 id name somethingelse 该表没有设置索引 我收到 未定义索引 在 phpmyadmin 中id 是一个 7 位字母数字值 每行都是唯一的 我想将 Drugid 设置为主键 索引 我不知道有没
  • SQL Server:索引或主键的总大小不能超过 900 字节

    我正在尝试在包含 URL 的列上放置索引 由于 URL 的最大长度超过 2000 个字符 因此我将数据类型设置为 NVARCHAR 3000 当我这样做时 我收到了错误The total size of an index or primar
  • 如何检查是否启用了更改跟踪

    我试图在运行之前确定我的数据库是否已启用更改跟踪ALTER DATABASE命令来启用它 我试图防止这些脚本多次运行时出现错误 我签到了sys databases and sys dm tran commit table但无法找到我要找的东
  • 在 SQL Server 中通过标准差消除异常值

    我试图通过标准差消除 SQL Server 2008 中的异常值 我只想要特定列中包含该列平均值的 1 标准差范围内的值的记录 我怎样才能做到这一点 如果您假设事件呈钟形曲线分布 则只有 68 的值与平均值相差 1 个标准差以内 95 的值
  • Oracle 删除约束级联等效于 Sql Server

    在Oracle中 删除约束PK SAI我使用语法 ALTER TABLE SAISIE DROP CONSTRAINT PK SAI CASCADE SQL Server 中与此等效的是什么 您正在考虑与实际 DELETE 语句相关的 FO
  • SQL Server JOIN 中的 IsNumeric

    我的问题似乎很简单 但我被困在这里 我有一个表 其中有一个名为 SrcID 的 nvarchar 列 我在其中存储数字和字符串 现在 当我尝试在 加入 条件下检查该列上的 IsNumeric 时 如下所示 ISNUMERIC SrcID 1

随机推荐

  • 如何在C++中输出欧元符号

    我试图为一个计算出租车费用的程序输出一个 Eurosign 然后将其转换为美元或欧元 规范的一部分是我必须输出 Eurosign 我已经尝试过 Unicode 但我没有任何运气 任何帮助将不胜感激 谢谢 这是我的代码 void produc
  • Visual Studio 2012“扩展和更新”“无法连接到远程服务器”

    不幸的是 过去几个月的情况就是如此 我无法安装新的或更新的软件包工具 gt 扩展和更新我尝试了一切 但无法找到原因 我试过了 访问 NuGet 并从 下载包 包管理器控制台 安装包 SUCCESS 使用 Web 浏览器访问存储库 Visua
  • Boost asio,单个 TCP 服务器,多个客户端

    我正在创建一个 TCP 服务器 它将使用 boost asio 它将接受来自许多客户端的连接 接收数据并发送确认 问题是我希望能够接受所有客户 但我一次只想与一个客户合作 我希望所有其他事务都保留在队列中 Example 客户端1连接 客户
  • 使用 spring-data-jpa 自定义 ItemReader

    我正在使用现有实体和存储库创建一个 Spring 批处理项目 我需要使用自定义ItemReader用于使用现有 jpa 存储库读取数据的作业 定制阅读器 public class InMemoryReader implements Item
  • 在 INSERT 之后使用 OUTPUT 将标识列的值获取到(非表值)变量中

    给出以下简单的测试表 CREATE TABLE dbo Test Id bigint IDENTITY 1 1 NOT NULL Name varchar 50 NULL 我想在之后将标识列的值放入标量变量中INSERT使用OUTPUT条款
  • 使用 $dialog 多次打开同一个对话框

    我创建这个 plnkr http plnkr co edit fdAdDNU9adtYrY9smQvU p preview在回答这个问题时 AngularJS 在对话框中打开控制器 动态加载模板 https stackoverflow co
  • Android 中已弃用 URLEncodedUtils

    URLEncodedUtils在 Android API 22 中已弃用 我可以在这段代码中使用什么来代替 我需要改变URLEncode Utils Format line public String construct return if
  • Winapi :: 获取可用句柄数

    我想创建长时间运行我的程序的测试 并不时输出可用句柄的计数 我怎样才能用一些 WINAPI 函数来做到这一点 这是一篇关于如何调试句柄泄漏的好文章http blogs technet com b yongrhee archive 2011
  • 将 Base64 jpeg 图像传递给 og:image

    我的网站上有在运行时生成的图像 我使用 html 将其显示 img src 现在 我希望 Facebook 获取此图像 但如果我对 og image 元标记执行相同操作 Facebook 调试器会给我一个错误 有什么解决办法吗 当然 我想避
  • 将一系列值映射到另一个值

    我正在尝试找到一种有效的方法将一系列值映射到另一个值 例如 1 9 gt 49 10 24 gt 54 25 49 gt 59 50 74 gt 50 75 99 gt 49 100 150 gt 40 这里的值不遵循任何常规模式 一种解决
  • 由于其保护级别,文本框无法访问[重复]

    这个问题在这里已经有答案了 课堂作业要求我们创建一份简单的能源账单 第一天生成一个 ID 号 我想将其复制到第二个表格 但我不断收到以下信息 错误 CS0122 Form1 idgen 由于其保护级别而无法访问由于我将引用第一种形式中的许多
  • build.gradle 错误:无法创建tastk ':generateLockfiles'。 Flutter项目中但App运行正常

    我的 Flutter 项目中的 build gradle 文件 android build gradle 有错误 该应用程序运行完全正常 但这个错误对我来说仍然不太好 有人遇到过这个问题 错误吗 这是我完整的 build gradle 文件
  • 如何实现对无缓冲通道的非阻塞写入?

    From 有效的行动 https golang org doc effective go html channels 接收器总是阻塞 直到有数据要接收 如果通道未缓冲 则发送方会阻塞 直到接收方收到该值 But 信号 通知 https go
  • NodeJs - esc 不是函数

    我在尝试渲染时遇到了一个奇怪的问题 ejs文件在此特定行 TypeError home me nodeapp app views default page connection ejs 66 64 div class col s12 l8
  • 如何限制pyTelegramBotAPI中少数用户的访问?

    我正在使用远程机器人 https github com eternnoir pyTelegramBotAPI https github com eternnoir pyTelegramBotAPI 创建一个机器人来向其用户发送照片 关键是我
  • 请求对象传递给 Django-Tables2 Tables 类

    假设我们有两个模型 ModelS 和 Model B 我将使用 Django Tables2 从这些模型中创建一个表 在tables py 中 您可以有两个单独的表类 如下 from models import ModelA ModelB
  • Python-social-auth使用Django服务器主机名和监听端口作为redirect_uri

    我正在将 python social auth 与 Django 一起使用 以使用 Oauth2 google oauth2 向 Google 进行身份验证 在我的模板中我使用了一些东西like https github com omab
  • 如何在 Node.JS Google Cloud 函数中获取访问令牌?

    我在 Google Cloud 上的 Node JS 中有一个云函数 我需要向 Google 发出 GET 请求 并且它需要一个身份验证令牌 使用curl你可以使用生成一个 gcloud auth application default p
  • 用累积值表示设置时间

    调度问题有很多系列 我正在研究一个问题 我有一系列的工作 任务 需要从一个家庭过渡到另一个家庭 需要重新配置机器 设置时间 我在用着cumulatives 2 3 解决这个问题 但我不确定设置时间如何 可以表达 在这个小例子中 我有 10
  • 删除主键(聚集索引)以提高插入性能

    我们一直在经历 SQL 超时 并已确定该瓶颈是审核表 我们系统中的所有表都包含插入 更新和删除触发器 这些触发器会导致新的审核记录 这意味着审计表是系统中最大且最繁忙的表 然而数据只进入 永远不会出来 在这个系统下 所以没有select需要