是否可以减少sap-sql-and-where数据库文件的大小?几周后,我们的数据库大小约为10GB,因为数据库不会自动减少数据库大小。但事实上,数据库只包含240MB的数据。我这样计算数据库大小:
SELECT sum((((table_page_count * DB_PROPERTY('PageSize')) / 1024) / 1024)) dbsize FROM SYSTAB
一种方法应该是卸载和加载数据库,但这似乎非常耗时,而且在运行时是不可能的。
有人知道如何解决这个问题吗?
谢谢!
您的大小计算缺少索引使用的空间、行扩展使用的空间和检查点日志使用的空间。sa_table_page_usage()过程或dbinfo实用程序是计算数据库文件使用量的更好方法,但仍然不会告诉您检查点日志有多大。
为了回答您的问题,当您关闭数据库文件时,数据库文件的大小可能会自动缩小,因为当服务器关闭时,检查点日志会从数据库文件中删除。但是,回收可用表/索引页以缩小数据库文件大小的唯一方法是重建数据库。除非您真的需要空间,否则没有理由这样做。数据库服务器将根据需要重新使用免费页面。
根据https://dba.stackexchange.com/questions/43221/shrink-a-sql-anywhere-12-database解决方案是使用dbunload命令卸载/重新加载数据库(当然是离线)。有关此命令的详细信息,请访问http://dcx.sybase.com/1200/en/dbadmin/dbunload.html.
该页面上的另一个答案给出了这个示例命令行:
dbunload -c "UID=username;PWD=password;DBF=DB_old.db" -an "DB_new"
- DB_old.DB是原始数据库的名称
- DB_new.DB是缩小后的数据库的名称
- "DB_old"one_answers"DB_new"文件的位置相对于正在运行的服务器的路径
如果dbspace中有多个文件:
DB1_old.db, DB2_old.db, ... DBn_old.db
那么它就是的结果
DB1_new.dbr, DB2_new.dbr .... DBn_new.dbr
连接字符串的示例可在链接到上面的dbunload参考页中找到。
这就是我们在Sybase ASE检查数据库中使用的大小的方法:
select
convert (varchar(61),o.name+'.'+i.name ) as object,
rowtotal = convert(numeric(18,0),0),
convert(bigint,used_pages(db_id(), o.id,indid)) * @@maxpagesize/1024 as used_pages_kb,
convert(bigint,data_pages(db_id(), o.id,indid)) * @@maxpagesize/1024 as data_pages_kb,
convert(bigint,reserved_pages(db_id(),o.id,indid)) * @@maxpagesize/1024 as reserved_kb
from
sysobjects o,
sysindexes i
where
o.type='U'
and o.id=i.id
order by used_pages_kb desc
它显示每个对象使用的大小(表示表、索引等)