Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 桌子空间太大了_Sql Server_Diskspace - Fatal编程技术网

Sql server 桌子空间太大了

Sql server 桌子空间太大了,sql-server,diskspace,Sql Server,Diskspace,我有一个SQL Server数据库,其中使用的空间对于来自特定应用程序的日志表来说太大 分析磁盘使用情况显示,主键索引的磁盘使用情况是占用空间的原因 主键每行消耗200k,这似乎太多了。 在同一应用程序的不同实例上,同一主键对每行使用20k到40k 如何降低磁盘使用率?这是一个日志表,我们可以重建/截断等。实际上它已经完成了 不必担心保存数据 CREATE TABLE [dbo].[logs]( [id] [int] IDENTITY(1,1) NOT NULL, [user]

我有一个SQL Server数据库,其中使用的空间对于来自特定应用程序的日志表来说太大

分析磁盘使用情况显示,主键索引的磁盘使用情况是占用空间的原因

主键每行消耗200k,这似乎太多了。 在同一应用程序的不同实例上,同一主键对每行使用20k到40k

如何降低磁盘使用率?这是一个日志表,我们可以重建/截断等。实际上它已经完成了 不必担心保存数据

CREATE TABLE [dbo].[logs](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [user] [varchar](50) NULL,
    [table] [varchar](50) NULL,
    [operation] [varchar](10) NULL,
    [query] [varchar](max) NULL,
    [date] [datetime] NOT NULL,
    [post] [varchar](max) NULL,
    [script_name] [varchar](50) NULL,
    [query_string] [varchar](1024) NULL,
    [user_agent] [varchar](200) NULL,
 CONSTRAINT [PK_logs] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

SELECT
    OBJECT_NAME(i.OBJECT_ID) AS TableName,
    i.name AS IndexName,
    i.index_id AS IndexID,
    8 * SUM(a.used_pages) AS 'Indexsize(KB)',
    ck.total,
    8 * SUM(a.used_pages) / ck.total AS 'Indexsize(KB)/row'
FROM sys.indexes AS i
JOIN sys.partitions AS p ON p.OBJECT_ID = i.OBJECT_ID AND p.index_id = i.index_id
JOIN sys.allocation_units AS a ON a.container_id = p.partition_id
JOIN (SELECT COUNT(*) AS total FROM logs) ck ON 1 = 1
WHERE OBJECT_NAME(i.OBJECT_ID) = 'logs'
GROUP BY i.OBJECT_ID,i.index_id,i.name,ck.total
ORDER BY OBJECT_NAME(i.OBJECT_ID),i.index_id

与您的问题无关,但不是使用ON 1=1进行hacking JOIN,而是从日志ck[…]200k中为每行选择COUNT*AS total;20万到底是什么?200千字节?每排?对于标识列上的主键?我很难相信这一点。是什么让你得出这个结论的?@TT。行的20k到40k听起来并不正确。我意识到20-40k也太多了,但我们正在处理pk占用更多磁盘空间的特殊情况。该表每天接收5000个输入。做数学题,你就会看到问题的大小。理想情况下,我们希望保留过去90天的日志。我在上面发布了查询分析磁盘空间。所以你仍然要求每行使用200kb的索引?那么200kb乘以5000,你的索引每天增长1000000KB?这是±1000MB,或者仅仅是指数一天±1Gb?我想不是!与您的问题无关,但不是使用ON 1=1进行hacking JOIN,而是从日志ck[…]200k中为每行选择COUNT*AS total;20万到底是什么?200千字节?每排?对于标识列上的主键?我很难相信这一点。是什么让你得出这个结论的?@TT。行的20k到40k听起来并不正确。我意识到20-40k也太多了,但我们正在处理pk占用更多磁盘空间的特殊情况。该表每天接收5000个输入。做数学题,你就会看到问题的大小。理想情况下,我们希望保留过去90天的日志。我在上面发布了查询分析磁盘空间。所以你仍然要求每行使用200kb的索引?那么200kb乘以5000,你的索引每天增长1000000KB?这是±1000MB,或者仅仅是指数一天±1Gb?我想不是!