详细
请问一下
A 在sql server2005数据库中修改大量数据的时候,例如:20万条
B 以及在sql server2005数据库中先删除这些数据再插入相关的数据
以上2种情况,哪一种占用的资源最少,性能最优化。
11 个解决方案
#1
压缩日志及数据库文件大小
/*--特别注意
请按步骤进行,未进行前面的步骤,请不要做后面的步骤
否则可能损坏你的数据库.
一般不建议做第4,6两步
第4步不安全,有可能损坏数据库或丢失数据
第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.
--*/
--下面的所有库名都指你要处理的数据库的库名
1.清空日志
DUMP TRANSACTION 库名 WITH NO_LOG
2.截断事务日志:
BACKUP LOG 库名 WITH NO_LOG
3.收缩数据库文件(如果不压缩,数据库的文件不会减小
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
也可以用SQL语句来完成
--收缩数据库
DBCC SHRINKDATABASE(库名)
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
DBCC SHRINKFILE(1)
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
a.分离数据库:
企业管理器--服务器--数据库--右键--分离数据库
b.在我的电脑中删除LOG文件
c.附加数据库:
企业管理器--服务器--数据库--右键--附加数据库
此法将生成新的LOG,大小只有500多K
或用代码:
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
a.分离
EXEC sp_detach_db @dbname = '库名 '
b.删除日志文件
c.再附加
EXEC sp_attach_single_file_db @dbname = '库名 ',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\库名.mdf '
5.为了以后能自动收缩,做如下设置:
企业管理器--服务器--右键数据库--属性--选项--选择 "自动收缩 "
--SQL语句设置方式:
EXEC sp_dboption '库名 ', 'autoshrink ', 'TRUE '
6.如果想以后不让它日志增长得太大
企业管理器--服务器--右键数据库--属性--事务日志
--将文件增长限制为xM(x是你允许的最大数据文件大小)
--SQL语句的设置方式:
alter database 库名 modify file(name=逻辑文件名,maxsize=20)
/*--特别注意
请按步骤进行,未进行前面的步骤,请不要做后面的步骤
否则可能损坏你的数据库.
一般不建议做第4,6两步
第4步不安全,有可能损坏数据库或丢失数据
第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.
--*/
--下面的所有库名都指你要处理的数据库的库名
1.清空日志
DUMP TRANSACTION 库名 WITH NO_LOG
2.截断事务日志:
BACKUP LOG 库名 WITH NO_LOG
3.收缩数据库文件(如果不压缩,数据库的文件不会减小
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
也可以用SQL语句来完成
--收缩数据库
DBCC SHRINKDATABASE(库名)
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
DBCC SHRINKFILE(1)
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
a.分离数据库:
企业管理器--服务器--数据库--右键--分离数据库
b.在我的电脑中删除LOG文件
c.附加数据库:
企业管理器--服务器--数据库--右键--附加数据库
此法将生成新的LOG,大小只有500多K
或用代码:
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
a.分离
EXEC sp_detach_db @dbname = '库名 '
b.删除日志文件
c.再附加
EXEC sp_attach_single_file_db @dbname = '库名 ',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\库名.mdf '
5.为了以后能自动收缩,做如下设置:
企业管理器--服务器--右键数据库--属性--选项--选择 "自动收缩 "
--SQL语句设置方式:
EXEC sp_dboption '库名 ', 'autoshrink ', 'TRUE '
6.如果想以后不让它日志增长得太大
企业管理器--服务器--右键数据库--属性--事务日志
--将文件增长限制为xM(x是你允许的最大数据文件大小)
--SQL语句的设置方式:
alter database 库名 modify file(name=逻辑文件名,maxsize=20)
#2
需要整理过索引或重建索引。。提高查询的效率
收缩日志、数据库可以省空间
收缩日志、数据库可以省空间
#3
个人以为:B
#4
因为要做一个提案,需要确实数据,具体的上部的操作我了解,谢谢
我想知道哪一种操作会快一些。
谢谢
#5
哈哈,LZ想知道:数据量大的时候,直接update数据效率高
还是delete再insert效率高!是不是啊LZ?
还是delete再insert效率高!是不是啊LZ?
#6
update数据时,应该也是先delete再insert;
分开应该会快些吧!
分开应该会快些吧!
#7
根据情况来定
如果旧数据库内的数据全部清空在插入的话
truncate table
insert (...)tab
select ...from
个人觉得第2种快一点
但是如果有条件选择更新的话
个人觉得第一个好点
第二种方法
先删除再添加会 扫描两次表内的数据 然后会修改2次索引页内的内容 如果有聚集索引的话会 调整 2次 物理存储的数据位置
直接UPDATE 只扫描一次数据 不会调整物理存储数据位置等
如果旧数据库内的数据全部清空在插入的话
truncate table
insert (...)tab
select ...from
个人觉得第2种快一点
但是如果有条件选择更新的话
个人觉得第一个好点
第二种方法
先删除再添加会 扫描两次表内的数据 然后会修改2次索引页内的内容 如果有聚集索引的话会 调整 2次 物理存储的数据位置
直接UPDATE 只扫描一次数据 不会调整物理存储数据位置等
#8
to 飞天小虫
你说的详细资料有没有?能提供相关的连接吗??
谢谢
你说的详细资料有没有?能提供相关的连接吗??
谢谢
#9
分别看下执行计划就知道了 (crtl+L)
1.
2.
个人感觉还是 UPDATE 好点
拿第2 个来说 比如更新其中某几条数据
UPDATE 就 扫描一次表
delete/INSERT 扫描两次表
1.
update a set id='12' where id='dsa'
truncate table a
insert into a
select * from a where id='fdsafasd'
2.
update a set id='12' where id='dsa'
delete from a where id='fdsa'
insert into a
select * from a where id='fdsafasd'
个人感觉还是 UPDATE 好点
拿第2 个来说 比如更新其中某几条数据
UPDATE 就 扫描一次表
delete/INSERT 扫描两次表
#10
添加一个唯一索引再看执行计划
update 查找一次索引
delete/insert 查找2次索引
create UNIQUE index test_i on a(id)
update a set id='12' where id='dsa'
delete from a where id='fdsa'
insert into a
select * from a where id='fdsafasd'
update 查找一次索引
delete/insert 查找2次索引
#11
A
如果一个表字段很多,而你更新的只是其中某几个字段,那么选择A
如果你的更新的是所以字段那么个人认为是B
当然楼上说的先 truncate 再 insert 也不错,不过这种情况应该少之又少
如果一个表字段很多,而你更新的只是其中某几个字段,那么选择A
如果你的更新的是所以字段那么个人认为是B
当然楼上说的先 truncate 再 insert 也不错,不过这种情况应该少之又少
#1
压缩日志及数据库文件大小
/*--特别注意
请按步骤进行,未进行前面的步骤,请不要做后面的步骤
否则可能损坏你的数据库.
一般不建议做第4,6两步
第4步不安全,有可能损坏数据库或丢失数据
第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.
--*/
--下面的所有库名都指你要处理的数据库的库名
1.清空日志
DUMP TRANSACTION 库名 WITH NO_LOG
2.截断事务日志:
BACKUP LOG 库名 WITH NO_LOG
3.收缩数据库文件(如果不压缩,数据库的文件不会减小
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
也可以用SQL语句来完成
--收缩数据库
DBCC SHRINKDATABASE(库名)
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
DBCC SHRINKFILE(1)
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
a.分离数据库:
企业管理器--服务器--数据库--右键--分离数据库
b.在我的电脑中删除LOG文件
c.附加数据库:
企业管理器--服务器--数据库--右键--附加数据库
此法将生成新的LOG,大小只有500多K
或用代码:
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
a.分离
EXEC sp_detach_db @dbname = '库名 '
b.删除日志文件
c.再附加
EXEC sp_attach_single_file_db @dbname = '库名 ',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\库名.mdf '
5.为了以后能自动收缩,做如下设置:
企业管理器--服务器--右键数据库--属性--选项--选择 "自动收缩 "
--SQL语句设置方式:
EXEC sp_dboption '库名 ', 'autoshrink ', 'TRUE '
6.如果想以后不让它日志增长得太大
企业管理器--服务器--右键数据库--属性--事务日志
--将文件增长限制为xM(x是你允许的最大数据文件大小)
--SQL语句的设置方式:
alter database 库名 modify file(name=逻辑文件名,maxsize=20)
/*--特别注意
请按步骤进行,未进行前面的步骤,请不要做后面的步骤
否则可能损坏你的数据库.
一般不建议做第4,6两步
第4步不安全,有可能损坏数据库或丢失数据
第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.
--*/
--下面的所有库名都指你要处理的数据库的库名
1.清空日志
DUMP TRANSACTION 库名 WITH NO_LOG
2.截断事务日志:
BACKUP LOG 库名 WITH NO_LOG
3.收缩数据库文件(如果不压缩,数据库的文件不会减小
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
也可以用SQL语句来完成
--收缩数据库
DBCC SHRINKDATABASE(库名)
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
DBCC SHRINKFILE(1)
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
a.分离数据库:
企业管理器--服务器--数据库--右键--分离数据库
b.在我的电脑中删除LOG文件
c.附加数据库:
企业管理器--服务器--数据库--右键--附加数据库
此法将生成新的LOG,大小只有500多K
或用代码:
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
a.分离
EXEC sp_detach_db @dbname = '库名 '
b.删除日志文件
c.再附加
EXEC sp_attach_single_file_db @dbname = '库名 ',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\库名.mdf '
5.为了以后能自动收缩,做如下设置:
企业管理器--服务器--右键数据库--属性--选项--选择 "自动收缩 "
--SQL语句设置方式:
EXEC sp_dboption '库名 ', 'autoshrink ', 'TRUE '
6.如果想以后不让它日志增长得太大
企业管理器--服务器--右键数据库--属性--事务日志
--将文件增长限制为xM(x是你允许的最大数据文件大小)
--SQL语句的设置方式:
alter database 库名 modify file(name=逻辑文件名,maxsize=20)
#2
需要整理过索引或重建索引。。提高查询的效率
收缩日志、数据库可以省空间
收缩日志、数据库可以省空间
#3
个人以为:B
#4
因为要做一个提案,需要确实数据,具体的上部的操作我了解,谢谢
我想知道哪一种操作会快一些。
谢谢
#5
哈哈,LZ想知道:数据量大的时候,直接update数据效率高
还是delete再insert效率高!是不是啊LZ?
还是delete再insert效率高!是不是啊LZ?
#6
update数据时,应该也是先delete再insert;
分开应该会快些吧!
分开应该会快些吧!
#7
根据情况来定
如果旧数据库内的数据全部清空在插入的话
truncate table
insert (...)tab
select ...from
个人觉得第2种快一点
但是如果有条件选择更新的话
个人觉得第一个好点
第二种方法
先删除再添加会 扫描两次表内的数据 然后会修改2次索引页内的内容 如果有聚集索引的话会 调整 2次 物理存储的数据位置
直接UPDATE 只扫描一次数据 不会调整物理存储数据位置等
如果旧数据库内的数据全部清空在插入的话
truncate table
insert (...)tab
select ...from
个人觉得第2种快一点
但是如果有条件选择更新的话
个人觉得第一个好点
第二种方法
先删除再添加会 扫描两次表内的数据 然后会修改2次索引页内的内容 如果有聚集索引的话会 调整 2次 物理存储的数据位置
直接UPDATE 只扫描一次数据 不会调整物理存储数据位置等
#8
to 飞天小虫
你说的详细资料有没有?能提供相关的连接吗??
谢谢
你说的详细资料有没有?能提供相关的连接吗??
谢谢
#9
分别看下执行计划就知道了 (crtl+L)
1.
2.
个人感觉还是 UPDATE 好点
拿第2 个来说 比如更新其中某几条数据
UPDATE 就 扫描一次表
delete/INSERT 扫描两次表
1.
update a set id='12' where id='dsa'
truncate table a
insert into a
select * from a where id='fdsafasd'
2.
update a set id='12' where id='dsa'
delete from a where id='fdsa'
insert into a
select * from a where id='fdsafasd'
个人感觉还是 UPDATE 好点
拿第2 个来说 比如更新其中某几条数据
UPDATE 就 扫描一次表
delete/INSERT 扫描两次表
#10
添加一个唯一索引再看执行计划
update 查找一次索引
delete/insert 查找2次索引
create UNIQUE index test_i on a(id)
update a set id='12' where id='dsa'
delete from a where id='fdsa'
insert into a
select * from a where id='fdsafasd'
update 查找一次索引
delete/insert 查找2次索引
#11
A
如果一个表字段很多,而你更新的只是其中某几个字段,那么选择A
如果你的更新的是所以字段那么个人认为是B
当然楼上说的先 truncate 再 insert 也不错,不过这种情况应该少之又少
如果一个表字段很多,而你更新的只是其中某几个字段,那么选择A
如果你的更新的是所以字段那么个人认为是B
当然楼上说的先 truncate 再 insert 也不错,不过这种情况应该少之又少