http://topic.csdn.net/u/20090921/19/d997e7f6-7269-475d-b5d1-47cb5f0f3271.html
大容量加载数据到现有表以及sql server数据库删除聚集索引的问题[问题点数:50 分]
kkcool
(Wooooooooood木头刀)
等 级:
结帖率:85.71%
楼主发表于:2009-09-21 19:04:03
环境:sql server 2005
场景: 现在要从平面文件中大容量加载数据到已有表中,已有表中已经存在大量的数据,当然也有聚集索引(主键)和非聚集 索引,为了防止事务日志膨胀过于厉害,要确保日志只做最小记录。
其中的一个步骤是将数据库回复模式设置成大容量日志恢复模式,但是这样好像是不够的,还需要删除索引,那么,问题是怎么样删除聚集索引(在主键上) ,因为主键上有唯一约束,所以在用户界面中直接删是删不掉的,约束文件夹中也没有这个约束,右键这个聚集索引后,将界面上的唯一复选框勾掉也不行,请问这个问题怎么解决,sql语句 和 直接界面操作都可以,不过sql语句我查到过一些,主要是想知道sql有没有提供这样的用户界面,不用写语句。
另:大容量加载数据到一个sql server数据库中,大家一般会怎么做,bcp?bulk insert?openrowset?向导?还有别的?。 数据库的日志满了以后大家一般怎么做,或者说怎么做好些,备份然后删除然sql自动创建一个新的?还是收缩?截断?
初学,谢谢
#1楼 得分:0 回复于:2009-09-21 19:11:21
用户界面就是在主键约束里面,然后右键,删除
但如果数据很大的话这样做可能超时,最好用语句做
SQL code
alter table [ tablename ] drop constraint [ PK_name ]
#2楼 得分:0 回复于:2009-09-21 19:13:09
楼主想不删除主键的情况下只把主键的聚集索引删掉??这个貌似不行
#3楼 得分:0 回复于:2009-09-21 19:14:55
SQL code
-- 备份数据库
BACKUP DATABASE testdb TO DISK = ' d:/data/testdb20070906.bak '
-- 清空日志
DUMP TRANSACTION testdb WITH NO_LOG
-- 截断事务日志
BACKUP LOG testdb WITH NO_LOG
-- 收缩数据库
DBCC SHRINKDATABASE(testdb)
-- 设置自动收缩
EXEC SP_DBOPTION testdb,AUTOSHRINK,TRUE
#4楼 得分:0 回复于:2009-09-21 19:15:38
#5楼 得分:0 回复于:2009-09-21 23:42:25
SQL code
if ( object_id ( ' test ' ) is not null )
drop table test
go
create table test (serv_id int primary key ,serv_name varchar ( 50 ))
go
-- ----删除主键 聚集索引自动删除
alter table test drop constraint PK__test__1ED998B2
go
-- ----重新建立主键 非聚集
alter table test add constraint pk_test primary key nonclustered (serv_id)
go
#6楼 得分:0 回复于:2009-09-21 23:59:38
SQL code
SQL日志文件增的太快处理
方法1、
-- 在查询分析器,选中所要清理日志的数据库,执行如下SQL
backup log 数据库名 with no_log
DBCC SHRINKFILE ( 日志文件名或日志文件ID,要缩小的目标大小)
在当前数据库下
select fileid,groupid,name from sysfiles where groupid = 0
/*
----------------------------------------
得到以下结果
fileid groupid name
2 0 test_log
*/
-- 以上结果,fileid为日志文件ID,name为test_log
你可以
backup log test with no_log
dbcc shrinkfile ( 2 , 2 )
or
backup log test with no_log
dbcc shrinkfile ( ' test_log ' , 2 )
-- ***********************************************************************************************
如果以后,不想要它变大,在数据库上点右键 -> 属性 -> 选项 -> 故障恢复 模型 选择 简单模型就可以了!
或用SQL语句
alter database 数据库名 set recovery simple
-- ============================================================================================================
如果把还原模型调到简单,这样就不支持时间点还原了,但是日志文件会很小,如果数据比较重要推荐还是把数据库的还原模型调为完全。
-- ************************************************************************************************
方法2、企业管理器— > 右键数据库— > 所有任务— > 收缩数据库— > 文件按钮— > 选中日志文件— > 设置收缩操作选项— > 确定。
#7楼 得分:0 回复于:2009-09-22 06:52:30
大数据量加载到库可以用SSIS完成,这样便于检查和保持易用性。 对于日志如果没有特别要求,比如从日志恢复数据,则将数据库设置为简单模式,这样产生日志非常小,不过备份显得非常重要。 简单模式下日志增大,可以完全备份并清除log。
#8楼 得分:0 回复于:2009-09-22 09:51:17
引用 2 楼 lg314 的回复:
楼主想不删除主键的情况下只把主键的聚集索引删掉??这个貌似不行
是,不能删除主键
#9楼 得分:0 回复于:2009-09-22 09:52:22
引用 8 楼 kkcool 的回复:
引用 2 楼 lg314 的回复: 楼主想不删除主键的情况下只把主键的聚集索引删掉??这个貌似不行
是,不能删除主键
设计表!取消主健不行吗?
#10楼 得分:0 回复于:2009-09-22 09:53:43
引用 4 楼 soft_wsx 的回复:
对楼主的意思,不是完全明白!
就是要做到只做最小记录,只设置成大容量恢复模式是不够的,还要删除索引,问题是怎么删除聚集索引,如果不删除的话,即使恢复模式设置成了大容量模式,仍旧会记录完整的日志
#11楼 得分:0 回复于:2009-09-22 09:55:29
楼主 不删除主键而删除聚集索引好象是不行的 除非你取消主键或者删除主键
#12楼 得分:0 回复于:2009-09-22 09:56:33
引用 7 楼 claro 的回复:
大数据量加载到库可以用SSIS完成,这样便于检查和保持易用性。 对于日志如果没有特别要求,比如从日志恢复数据,则将数据库设置为简单模式,这样产生日志非常小,不过备份显得非常重要。 简单模式下日志增大,可以完全备份并清除log。
谢谢你的帮忙,不过我这个问题是在设置成大容量恢复模式的时候遇到的,所以我想在大容量模式下解决它
#13楼 得分:0 回复于:2009-09-22 09:58:15
引用 9 楼 soft_wsx 的回复:
引用 8 楼 kkcool 的回复: 引用 2 楼 lg314 的回复: 楼主想不删除主键的情况下只把主键的聚集索引删掉??这个貌似不行
是,不能删除主键 设计表!取消主健不行吗?
你在往已有数据的表中追加大量数据的时候是怎么做的?有么有什么好方法
#14楼 得分:0 回复于:2009-09-22 10:03:46
插入大量数据的时候,日志的问题不说,表中大量索引的维护开销也会造成严重的的阻塞,这种问题难道只能通过分区来解决么?在2005以前的版本就要不断地建立新表?