SQL - SQL Server 列出每个表所占用空间大小


SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    t.Name


<think>嗯,我现在要了解一下SQL Server 2019的列存储和内存怎么用。首先,我得先弄清楚这两个概念分别是什么,以及它们各自的用途和优势。 列存储(Columnstore)应该和传统的行存储不同吧?行存储是按行来存储数据,而列存储是按列存储的,这样对于分析查询应该更快,因为可以只读取需要的列,减少I/O。不过具体在SQL Server 2019里,列存储索引是怎么创建的呢?是不是只能在特定的上使用?需要哪些步骤? 然后是内存(In-Memory OLTP),也就是内存优化。内存的数据是不是都放在内存里,所以访问速度更快?适合高并发的OLTP场景?但内存的结构和普通有什么不同呢?创建的时候需要指定哪些选项?比如是不是要用MEMORY_OPTIMIZED=ON?还有,内存是否支持列存储索引呢? 可能用户的问题是想知道如何结合使用这两个技术,或者分别在什么场景下使用它们。比如列存储用于分析,内存用于事务处理。不过SQL Server是否允许两者同时使用呢?例如在内存上创建列存储索引?或者列存储索引只能用于基于磁盘的? 接下来,我需要回忆一下SQL Server 2019的文档。列存储索引分为聚集和非聚集两种。聚集列存储索引会将整个转换为列存储格式,而非聚集则是创建一个列存储的索引,同时还是行存储的。创建列存储索引的语法应该是使用CREATE COLUMNSTORE INDEX语句,或者在创建的时候指定。 对于内存,创建时需要加上WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_AND_DATA)之类的选项。内存默认使用行存储,并且可以创建哈希索引或者范围索引。但内存是否支持列存储呢?根据我之前的知识,可能是不支持的,因为列存储通常用于分析,而内存OLTP是针对事务处理的。需要确认这一点。 另外,内存的数据完全存储在内存中,但持久化的内存还会在磁盘上有备份,所以即使重启数据也不会丢失。而列存储索引可能更适合大数据量的分析查询,利用批处理模式执行,提高性能。 用户可能想知道如何在实际应用中应用这两种技术,比如在同一个数据库中,某些使用内存处理事务,另一些使用列存储进行分析查询。或者是否有一种方式结合两者的优势? 现在需要整理一下具体的步骤,比如创建内存的语法示例,创建列存储索引的示例,以及它们各自的适用场景和限制。比如,列存储索引适合数据仓库、报等场景,而内存适合需要极低延迟和高吞吐量的事务处理。 可能还需要提到一些最佳实践,例如列存储索引的数据压缩优势,内存的并发处理能力,比如无锁结构和行版本控制,减少阻塞。 但要注意,列存储和内存是否有什么限制。比如内存是否有大小限制,是否受限于内存容量?而列存储索引在更新时可能会有性能影响,因为列存储更适合批量插入和查询。 最后,是否需要给出一个综合的例子,或者分别给出两个技术的使用示例?</think>### SQL Server 2019 列存储与内存使用指南 #### 一、列存储(Columnstore)技术 **用途**:优化分析型查询(OLAP),适合数据仓库、报等场景,通过列式存储减少I/O,提升聚合和扫描性能。 **核心特性**: - 数据按列压缩存储,减少磁盘占用- 支持批处理模式执行,提高查询效率。 - 支持聚集列存储索引(整体转换为列格式)和非聚集列存储索引(仅索引为列格式)。 **使用步骤**: 1. **创建聚集列存储索引**(转换为列存储): ```sql CREATE CLUSTERED COLUMNSTORE INDEX cci_Orders ON dbo.Orders; ``` 此时数据完全按列存储,适合静态或批量更新的场景。 2. **创建非聚集列存储索引**(保留行存储,添加列索引): ```sql CREATE NONCLUSTERED COLUMNSTORE INDEX ncci_OrderDetails ON dbo.OrderDetails (ProductID, Quantity, Price); ``` 适合需要同时支持事务和分析的混合负载。 **适用场景**: - 大数据量(百万行以上)的聚合查询(如SUM、AVG)。 - 需要高压缩率的场景(通常可压缩5-10倍)。 **限制**: - 频繁单行更新/删除可能导致行组碎片,需定期重建索引。 - 聚集列存储索引不支持唯一约束、主键等。 --- #### 二、内存(内存优化,In-Memory OLTP) **用途**:优化事务型负载(OLTP),适合高并发、低延迟场景(如金融交易、实时数据处理)。 **核心特性**: - 数据常驻内存,读写速度极快。 - 使用无锁结构(乐观并发控制),减少阻塞。 - 支持持久化(数据持久到磁盘)或非持久化(仅内存)。 **使用步骤**: 1. **启用数据库内存功能**: ```sql ALTER DATABASE MyDB ADD FILEGROUP mofg CONTAINS MEMORY_OPTIMIZED_DATA; ALTER DATABASE MyDB ADD FILE (NAME='mofile', FILENAME='/path/mofile') TO FILEGROUP mofg; ``` 2. **创建内存优化**: ```sql CREATE TABLE dbo.SessionData ( SessionID INT PRIMARY KEY NONCLUSTERED, UserID INT, LastActivity DATETIME ) WITH ( MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA -- 持久化(默认) ); ``` 3. **选择索引类型**: - **哈希索引**:适合等值查询(需指定BUCKET_COUNT): ```sql CREATE TABLE dbo.Transactions ( TxID INT PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 100000), Amount DECIMAL(18,2) ) WITH (MEMORY_OPTIMIZED = ON); ``` - **范围索引**:适合排序或范围查询: ```sql CREATE INDEX idx_LastActivity ON dbo.SessionData (LastActivity); ``` **适用场景**: - 每秒数千次的高并发写入(如日志记录)。 - 需要亚毫秒级响应的查询(如会话状态管理)。 **限制**: - 内存占用需可控(持久化仍需磁盘存储备份)。 - 不支持LOB类型(如`TEXT`、`XML`),大小受内存限制。 --- #### 三、列存储与内存的结合使用 **当前限制**: - **内存不支持列存储索引**:内存优化仅支持哈希/范围索引,无法直接创建列存储索引。 - **混合场景建议**: - **事务处理**:使用内存处理高频写入(如订单录入)。 - **分析查询**:通过ETL将数据同步到列存储(如每日报)。 **示例架构**: 1. 高频事务(内存): ```sql CREATE TABLE dbo.RealTimeTransactions ( TxID BIGINT PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000000), UserID INT, Amount DECIMAL(18,2) ) WITH (MEMORY_OPTIMIZED = ON); ``` 2. 分析(列存储): ```sql CREATE TABLE dbo.TransactionHistory ( TxID BIGINT, UserID INT, Amount DECIMAL(18,2), TxDate DATE ); CREATE CLUSTERED COLUMNSTORE INDEX cci_History ON dbo.TransactionHistory; ``` 3. 定时同步数据(如每小时): ```sql INSERT INTO dbo.TransactionHistory SELECT TxID, UserID, Amount, GETDATE() FROM dbo.RealTimeTransactions WHERE TxID > @LastProcessedID; ``` --- #### 四、最佳实践 1. **列存储优化**: - 批量插入数据(每次至少1024行)以生成高效行组。 - 定期重建索引整理碎片: ```sql ALTER INDEX cci_Orders ON dbo.Orders REORGANIZE; ``` 2. **内存优化**: - 预估哈希索引的`BUCKET_COUNT`(通常为预期数据量的1-2倍)。 - 避免长事务,内存无锁但冲突时会回滚。 --- **总结**: - **列存储**用于分析型查询,需关注批量处理和压缩。 - **内存**用于高频事务,需设计合理索引和内存容量。 - 两者互补,可分别用于混合负载中的不同模块。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值