数据库效率那个更高

wangbinwork 2008-03-09 06:51:16
假设我现在有一套主细表 细表内数据量在800-1000万条纪录左右
现在我要修改其中1条纪录 使用以下两种方式


1. 使用条件直接update细表的纪录
2. 先根据主表内的条件将细表中所有符合主表条件的纪录全部删除 然后在将该符合主表条件的细表内容进行插入


请问 那种方式效率更高???
...全文
379 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangbinwork 2008-04-24
  • 打赏
  • 举报
回复
谢谢大家的回复,下面将我的测试信息公布出来。
我的测试环境是
1.分别建立了2个数据库 (防止数据库有缓存问题的存在)
2.在2个数据库中分别建立了1个结构相同的表,字段数是30个。
3.做了一支程序,分别向两个表中插入300万条记录(查完耗时40分钟 晕)

然后分别按照以上两种操作方式进行操作,影响的数据行数为70行,最后结果是:

使用update:耗时1分14秒
使用delete+insert:耗时48.7秒

最终从单次操作上看是使用第二种效率要高一些。

至于楼上朋友所说的日志问题,理论上应该是第二种会高一些没有测试。
jetty_xiang 2008-03-24
  • 打赏
  • 举报
回复
12楼分析得很正确
闪破风浪 2008-03-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qianjin036a 的回复:]
不是试试的问题,在sqlserver内核里,update语句本来就是由delete和insert两个操作来实现的.
还记得instead of触发器中使用deleted表和inserted表吗?那就是为update操作准备的.

如果要进行update操作,系统将进行delete操作和insert操作,涉及到创建insert表,接口数据向insert表传送,操作表中的数据向delete表中的转移,完整性约束检查,insert表中数据向操作表转移,delete表的删除这些步骤.
如果要进行delete操作加上insert操作,…
[/Quote]
懒得去死 2008-03-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 w2jc 的回复:]
当然是第一种效率高了。
第二种方法不管怎么说都强制SQL Server去更新相关的索引,而第一种方法则如7楼所说,对索引的影响可大可小。

更新数据量一大,或者使用时间一长之后,
第二种方法会明显导致索引碎片,从而降低速度的。


[/Quote]

同意!
w2jc 2008-03-10
  • 打赏
  • 举报
回复
回11楼:
索引是不存在什么碎片的,因为它本身就是一种指针.
对表进行更新,或删除加插入,系统都会对盘区中数据页之间进行数据移动,行位置总是会发生变化的.所以操作效率与索引无关.

-------------------------------------------
建议仔细一下这个:
Microsoft SQL Server 2000 索引碎片整理最佳实践
http://www.dycar.net/blog/article.asp?id=158

上面的内容翻译自MS官方的技术文档:
Microsoft SQL Server 2000 Index Defragmentation Best Practices
http://www.microsoft.com/technet/prodtechnol/sql/2000/maintain/ss2kidbp.mspx
parss 2008-03-10
  • 打赏
  • 举报
回复
第一种应该效率高点。
lhsxsh 2008-03-10
  • 打赏
  • 举报
回复
第一种
-晴天 2008-03-10
  • 打赏
  • 举报
回复
回11楼:
索引是不存在什么碎片的,因为它本身就是一种指针.
对表进行更新,或删除加插入,系统都会对盘区中数据页之间进行数据移动,行位置总是会发生变化的.所以操作效率与索引无关.
-晴天 2008-03-10
  • 打赏
  • 举报
回复
回8楼:
关系约束中删除子表的问题,只是我们从外部去看.系统内部完全可以在删除-插入两种操作完成之后再进行完整性检查,因为完整性检查本身就是一段程序,系统操作时,完全没有必要在内部操作的过程中插入这段程序来运行一下.
-晴天 2008-03-10
  • 打赏
  • 举报
回复
不是试试的问题,在sqlserver内核里,update语句本来就是由delete和insert两个操作来实现的.
还记得instead of触发器中使用deleted表和inserted表吗?那就是为update操作准备的.

如果要进行update操作,系统将进行delete操作和insert操作,涉及到创建insert表,接口数据向insert表传送,操作表中的数据向delete表中的转移,完整性约束检查,insert表中数据向操作表转移,delete表的删除这些步骤.
如果要进行delete操作加上insert操作,接口将传递两次数据
要比较这两组操作的效率,恐怕只能从这两种操作的效率去讨论.

如果要说到11楼涉及的索引的问题,那只能问MS,它们在进行这两组操作的时候,分别是如何进行索引的了.
Plife472 2008-03-10
  • 打赏
  • 举报
回复
NO 1
yinqi025 2008-03-10
  • 打赏
  • 举报
回复
推荐用第一种,你这样直接物理进行删除会使索引困难,
有些地方还是要用到楼主说的第二种情况
例:
权限模块中的 用户与角色 用名的角色是不固定的个数的,但是还是介意加一个标识列,select的时候加上where条件,
不过还是要看开发中具体情况而定
ivan_ren 2008-03-10
  • 打赏
  • 举报
回复
与被update的字段是否是索引列有关系,是,第一种方式效率要搞些,反之则差不多
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 kelph 的回复:]
只有对唯一索引的update,就是sql中说的deferred update,才做delete + insert的操作

否则都是direct update ,效率要高于delete + insert
[/Quote]

w2jc 2008-03-10
  • 打赏
  • 举报
回复
当然是第一种效率高了。
第二种方法不管怎么说都强制SQL Server去更新相关的索引,而第一种方法则如7楼所说,对索引的影响可大可小。

更新数据量一大,或者使用时间一长之后,
第二种方法会明显导致索引碎片,从而降低速度的。

kelph 2008-03-10
  • 打赏
  • 举报
回复
只有对唯一索引的update,就是sql中说的deferred update,才做delete + insert的操作

否则都是direct update ,效率要高于delete + insert
fcuandy 2008-03-10
  • 打赏
  • 举报
回复
回楼主:
第一种.
第一种和第二种从索引维护的区别上来看,对于普通索引和非索引列,势必都引起更新, 对于主健如果你都更新,那么说明,你的设计有点问题.所以不考滤更新主健的情况.
第二种,先delete再insert有点脱了裤子..的感觉. 不要被触发器干扰


to 14楼朋友:
索引是不存在什么碎片的,因为它本身就是一种指针.
----------------------------
请问索引以是以什么方式存储的? 它不可能凭空出现, 既然SqlServer的索引以磁盘文件的形式出现,那么不可避免会有碎片产生.

个人看法,仅供参考.
nzperfect 2008-03-10
  • 打赏
  • 举报
回复
对qianjin036a 的说法,不敢苟同.
nzperfect 2008-03-10
  • 打赏
  • 举报
回复
同意:w2jc
而且update 比 delete insert 产生的日志要小的多.
nzperfect 2008-03-10
  • 打赏
  • 举报
回复
第一种.
加载更多回复(11)
"plist图片查看工具 v1.2"是一款专为Mac用户设计的应用程序,旨在帮助开发者和设计师更方便地管理和查看.plist格式的图片资源。在iOS和Cocos2d-x游戏开发中,.plist文件通常用于存储图像序列,如动画帧或精灵表,以便于程序加载和播放。这款工具的最新更新v1.2版增强了用户体验和功能性。 更新后的功能之一是允许用户通过双击图块列表上的图块名称或大图上的图块来快速复制图块名称到剪贴板。这一改进极大地提升了工作效率,用户不再需要手动输入或复制这些名称,尤其在处理大量图块时,节省了宝贵的时间。 新添加的“导出图块”功能是这次更新的亮点。这个功能使得用户能够将查看的图块直接导出为所需的文件格式,这可能是PNG、JPG或其他常用的图像格式。这对于需要将单个图块用于其他项目,或者进行进一步编辑的开发者来说非常实用。它简化了从.plist文件中提取特定图像的过程,避免了在不同软件之间切换的繁琐操作。 Cocos2d-x是一个广泛使用的开源2D游戏开发框架,支持多种平台,包括iOS、Android和Mac等。.plist图片查看工具与Cocos2d-x的结合,为开发者提供了一个直观的界面,以管理他们在游戏中使用的图像资源。通过这款工具,开发者可以预览和调整Cocos2d-x项目中的精灵表和动画,确保游戏视觉效果的准确性和流畅性。 在实际应用中,例如在创建角色动作或游戏场景的动画时,开发者可以利用此工具快速检查每个帧的细节,然后轻松导出需要的图块进行微调。此外,这个工具还可以用于教学和学习,帮助初学者理解.plist文件的结构和工作原理。 "plist图片查看工具 v1.2"是一款针对Cocos2d-x开发者和设计师的强大辅助工具,其最新的更新提升了用户交互性和实用性,为.plist文件的管理和使用提供了便利。无论是快速复制图块名称还是导出单个图块,这些功能都大大提高了工作效率,降低了开发过程中的复杂性。对于那些频繁处理.plist格式图像资源的人来说,这无疑是一个不可或缺的利器。

34,871

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧