热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个考验国人对ms-sqlserver掌握水平的问题!

我现在有A、B、C、D、E、F、G,7个表,当删除A表时,A表有触发器同时删除B、C、D、E、F、G的数据,只删除A表的一条记录时,数度很快。但是当A表有700万数据,而我要带where条件删除500
我现在有A、B、C、D、E、F、G,7个表,当删除A表时,A表有触发器同时删除B、C、D、E、F、G的数据,只删除A表的一条记录时,数度很快。但是当A表有700万数据,而我要带where条件删除500万同时删除另外6个表的相关数据,delete A where status = 1语句就会很慢。因为这条语句由于A表上有触发器,它要删除的数据会是7个表的要删除数据的总和,有5000万之多。它要对日志进行大量的写入操作。

如果是用oracle数据库,可以用alter table XXX nologging来使7个表对的任何操作
都不写日志,delete from A where status = 1就会很快。

如果是用sybase数据库,可以在启动时带一个特别参数来使整个数据库对任何操作都
不写日志,达到同样的效果。

但是我在ms-sql server却找不到oracle或是sybase那样的方法。这里有人知道如何做吗?

31 个解决方案

#1


汗,不知道,楼主的题目太上纲上线了,我立马查资料去

#2


use  master  
exec  sp_dboption  'yourdbname','trunc.  log  on  chkpt.','true'  

try

#3


use  master  
exec  sp_dboption  'yourdbname',trunc. log on chkpt.','true'  

sorry,刚才写错了,具体可以查看master.dbo.spt_values 

#4


楼上的好像不行
trunc. log on chkpt. 当为 true 时,如果数据库处于日志截断模式,则检查点将截断日志中非活动的部分。只能为 master 数据库设置此选项。

#5


楼上的方法是让'yourdbname'的日志在检查点截断日志,不是操作时不写日志,是写完日志事务提交后日志自动截断。还是要写日志耗费时间的。

#6


刚才查了一下,没错,不行,呵呵
学习中。。。

#7


只能为 master 数据库设置此选项

非也

#8


to:KnowLittle(人傻不要紧,只要肯学习。)
我是觉得这个问题棘手,所以出这样的题目是想引起注意。
请大家不要生气我这样提问。

#9


不带日志全部删除某个表的全部数据倒是用过,的确快,但是没有用过加条件的大量删除。

#10


没啥,没啥,只要你不是来摆擂的就行,呵呵
等待高手出现ing, 
查资料ingp

#11


to: DJMPH(冷开水) 
    是的,truncate table XXX是很快的。
                            langtian

#12


看一下
http://expert.csdn.net/Expert/topic/1140/1140756.xml?temp=.6834833

#13


好象没什么好办法:
试试:
set rowcount 10000
while 1=1
delete ....

#14


看过了,
那个帖子的两种答案我都试过,但是都行不通。
第一种:在循环中设置rowcount有问题,应为我的其它表的数据会是A表的好几倍,这样会出现删除A表中的1000行,其它表也是1000行,其它表没有删除干净。
第二种:我要关联同时删除7个表的数据,用先bcp再truncate的方法要重复操作7个表,比较麻烦,也容易出错。
所以那个帖子的两种方法在我遇到的情况都不行。

#15


说句提外话:

为什么要让用户一下删除这么多数据那?而且是级联删除那么多表的操作
我感觉这种级别的操作应该是数据维护的时候(或者数据仓库导入,更新的时候)才需要用到,可以做成job放到深夜或者专门时间,慢一点是可以理解的阿

而且日志不写对于数据以后的维护和恢复也是不利的

#16


哦,我是在数据维护的时候做这个操作,这个操作让用户干的话,我们的系统就完蛋了。因为我们的系统必须保持24小时绝对可用,晚上的用户也很多,我能在55个小时删除这几千万数据(循环一次删一条),但是有很大风险。所以想删除快一点,
呵呵。
                                langtian

#17


to:KnowLittle(人傻不要紧,只要肯学习。) 
你是对的,实在不行的话就只有关掉系统慢慢删,呵呵。

#18


关注·

#19


我认为可以选得到所有要删除的ID,这可从表DELETED表中得到
删除其它表则用WHERE Id in()就可以删除相应的记录啰

#20


楼上的想法不错
但是楼主的trigger不一定是如此简单的逻辑

#21


现在且不谈删除,我们来看看大容量复制对事务日志的操作:
使用完整恢复模式时,所有由 bcp 执行的行插入操作都记录在事务日志中。如果数据量较大,会造成事物日志迅速写满。为了防止事务日志耗尽空间,当符合以下全部条件时,可以执行最小日志记录的大容量复制: 
1、恢复模式是简单模式或大容量日志记录模式。
2、没有正在复制目标表。
3、目标表没有任何触发器。
4、目标表具有 0 行或没有索引。
任何不满足上述条件的SQL Server实例的大容量复制都将记入日志。
如果是按照这样的条件话,估计以上的删除操作(带触发器)再SQL中是不可能不写入日志的。

#22


笨辦法,先把不刪的資料拉到另外的表中,
再把原來的表資料全部刪除再倒入或
用另外的表替換原來的表,呵呵~
這個方法笨不笨~

#23


好像只能截断日志,而不能不记录日志。

学习。。。

#24


sql好像没什么好办法!
找盖茨问问!?
关注!

#25


你的问题其实是递归触发的问题,你可以从2方面来试试:
1.解决DISK I/O的问题,比如不要记录日志,设置一次删除的行数...

CABO(白椒腊肉),j9988(j9988)的方法。

2.配置 TRIGGER SQL的参数.

FOR EXAMPLE: 
1.--禁用间接递归
USE master0
EXEC sp_configure 'nested triggers', '3'
RECONFIGURE WITH OVERRIDE
 --Need restart SQL SERVER SERVICE
2.--禁用直接递归
SET RECURSIVE_TRIGGERS OFF
3. 
 
3.手工写T-SQL,删除A表的记录和相关的B,C....。

4.SET RECURSIVE_TRIGGERS ON


#26


sorry:

USE master0
EXEC sp_configure 'nested triggers', '0'
RECONFIGURE WITH OVERRIDE
 --Need restart SQL SERVER SERVICE

#27


呵~兩個豆豆的就是不一樣~收藏!

#28


那怎么不写日志呢??

#29


不写日志可能做不到。MSSQL没有这个选项。只有某些操作可以不写日志。
以前有个贴子讨论过这个问题。可以用select into将不删除的数据放到新表里去.(这个操作不写日志)然后用tuncate table (也不写日志)\drop table删除整原表)。这样可以日志少点。但是好不好很难说。

#30


按钮jj下午好!
还得让盖茨把这个功能完善一下!!哈哈!!

#31


exec sp_dboption yourDB,'trunc. log on chkpt.',true
就可以在INSERT,UPDATE,DELETE时不写日志了,

推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
author-avatar
桦林ye家伟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有