显然是大量的主键索引

时间:2014-10-13 12:39:41

标签: sql-server database

免责声明:我不是MSSQL dba ....

我在stackoverflow [1]的其他地方使用了两个sql查询:https://stackoverflow.com/a/7892349/2195559 [2]:https://stackoverflow.com/a/17600911/2195559

[1]声称显示表及其索引使用的总空间 [2]声称显示索引使用的总空间

所以看看我最大的表:

  • [1]给出UsedSpaceKB = 58757504。所以表和索引是56GB

  • [2]为同一个表上的最大索引提供了Indexsize(KB)= 55166168(同一个表上还有一些其他索引 - 但相比之下它们很小)。所以最大的指数是52GB

[1] - [2](对于同一表上的索引)= 4GB。

所以IF [1]和[2]是正确的,我已经理解了输出,然后我有一个4GB的表,上面有52GB的主键索引。

问题:

  • 我是否正确理解[1]和[2]?
  • 如果是这样,那么如何在一个本身只有4GB的表上拥有52GB的pk索引?我们使用夜间批处理作业来删除此表中的旧行(它是审计日志),是否可能在从表中删除行时不减少索引?
  • 什么是最简单的&清除此索引的最快方法 - 删除和构建还是有一些更有效的机制?

表和pk索引的ddl是

CREATE TABLE "YYY"."XXX_audit"
(
   id numeric(19,0) PRIMARY KEY,
   version numeric(19,0),
   compressed_response image,
   date_created datetime,
   duration numeric(19,0),
   request text,
   response text,
   session_id varchar(255),
   uid varchar(255),
   webservice_uri varchar(255),
   event_id varchar(36)
)
GO
CREATE UNIQUE INDEX PK__XXX_audit__6CC31A31 ON "YYY"."XXX_audit"(id)

1 个答案:

答案 0 :(得分:0)

  

我是否正确理解1和[2]?

没有。您有一个表格,其中包含大小为52 GB的群集索引和一个大小为4GB的非群集索引。索引总大小:56 GB。您没有索引以外的任何内容。没有'表',只有索引。

我建议你先阅读Table and Index Organization。表可以组织为堆,作为聚簇索引B-Trees(以及作为聚簇列存储库或SQL Server 2014及更高版本中的Hekaton索引)。你在寻找什么作为表格'将是一个基本堆,但由于您声明了一个主键,该主键已成为表的聚簇索引,因此您没有基本堆。