- 论坛徽章:
- 0
|
近日查询某个有6百万行的用户表中的几十行数据,发现非常地慢,最后竟然用了十几个小时才出来结果。对此我一直不明白是表的哪里出了问题,于是我用“update all statistics TABLE”执行了一夜,执行完毕之后,再进行查询,结果发现还是很慢。
于是我采用“alter table TABLENAME drop constraint PK_TABLENAME”,决定先删除主键,然后再重建主键的方法试试。结果我运行该命令后得到的结果是“Msg 3701, Level 11, State 1 Cannot drop the constraint 'PK_TABLENAME', because it doesn't exist in the system catalogs.”。然后查询该表,结果真的没有主键。
(问题一:)在此,就产生了一个疑问:表在没有主键的情况下,前两天已经进行了对该表的写表操作(注:该表内的数据可以直接DELETE,由此证明该表没有外键,这样判断是否正确?),这样会不会产生数据不一致、数据混乱等各种潜在的问题?
基于以上情况,我决定先恢复主键,得到的结果却是“Msg 1105, Level 17, State 2
Can't allocate space for object 'TABLENAME' in database 'DATABASENAME' because 'default' segment is full/has no free extents. If you ran out of space in syslogs, dump the transaction log. Otherwise, use ALTER DATABASE or sp_extendsegment to increase size of the segment.”
(问题二:)根据提示,应该是没有空间了,我查询了一下我的LOG空间还有800M,应该是没有问题的,该表有6百多万行,数据占用空间500多兆,是不是我的数据库对于该表显得空间不足了?
(问题三:)针对此种情况,我决定采用如下方法:我有两个同样的用户数据库,其中一个是作测试库的,我先把测试库内数据“TRUNCATE TABLE”掉一些,誊出空间,然后把正式库内的该表数据“SELECT * INTO”到测试库内,再把该表“TRUNCATE TABLE”掉,再进行建主键、DBCC操作,最后把测试库内的数据“INSERT”到该表内,这样操作是否可行?有哪些需要注意的地方?
(问题四:)用户表的主键在没有人为操作的情况下,会不会出现被删除的情况?
望多多探讨,前辈们多多指教。
[ 本帖最后由 hbzxjj 于 2008-6-15 12:17 编辑 ] |
|