上上周,一个有一亿数据量的数据库,要处理提取特征,运算归纳分类零售额,并按天组合。关键是这个数据库有将近900个表格,完全没有做任何的中文注释。部分表格还是用了不同编码的格式存储。除了头大靠猜外,各种ai工具都无法有效辅助推测数据之间的关系。
那么如何有效处理呢,第一步,是删除空行的表格,虽然空行不一定就是毫无用处,但至少现阶段是无法从空行获得有效价值,不会带来任何好处。删除空行表语法:
DECLARE @TableName NVARCHAR(255) DECLARE @SQL NVARCHAR(MAX) DECLARE TableCursor CURSOR FOR SELECT TABLE_SCHEMA + '.' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' OPEN TableCursor FETCH NEXT FROM TableCursor INTO @TableName WHILE @@FETCH_STATUS = 0 BEGIN SET @SQL = 'IF NOT EXISTS (SELECT 1 FROM ' + @TableName + ') DROP TABLE ' + @TableName EXEC sp_executesql @SQL FETCH NEXT FROM TableCursor INTO @TableName END CLOSE TableCursor DEALLOCATE TableCursor
统计数据库行数:
USE [mons]; -- 获取所有表的总行数 SELECT SUM(p.rows) AS TotalRowCount FROM sys.tables AS t INNER JOIN sys.indexes AS i ON t.object_id = i.object_id INNER JOIN sys.partitions AS p ON i.object_id = p.object_id AND i.index_id = p.index_id WHERE t.is_ms
删除所有触发器:
USE [mons]; -- 替换为你的数据库名称 DECLARE @sql NVARCHAR(MAX) = ''; -- 查找所有触发器并生成删除语句 SELECT @sql = @sql + 'DROP TRIGGER ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ';' + CHAR(13) FROM sys.triggers t INNER JOIN sys.objects o ON t.object_id = o.object_id INNER JOIN sys.schemas s ON o.schema_id = s.schema_id; -- 输出 SQL 语句进行调试 PRINT @sql; -- 执行删除触发器的 SQL 语句 EXEC sp_executesql @sql;
列出所有表格的行数,并按照从大到小排序:
SELECT o.name AS TableName, p.rows AS RowCounts FROM sys.partitions p JOIN sys.objects o ON p.object_id = o.object_id WHERE p.index_id IN (0, 1) -- 0 表示堆,1 表示聚集索引 AND p.rows > 0 AND o.type = 'U' -- 确保是用户表 ORDER BY p.rows DESC;
删除所有没有执行代码的存储过程:
USE [mons]; -- 替换为你的数据库名称 DECLARE @sql NVARCHAR(MAX) = ''; -- 查找所有没有代码的存储过程 SELECT @sql = @sql + 'DROP PROCEDURE ' + QUOTENAME(s.name) + '.' + QUOTENAME(p.name) + ';' + CHAR(13) FROM sys.procedures p INNER JOIN sys.schemas s ON p.schema_id = s.schema_id WHERE OBJECT_DEFINITION(p.object_id) = '' -- 存储过程没有任何代码 OR OBJECT_DEFINITION(p.object_id) IS NULL; -- 存储过程定义为空 -- 输出 SQL 语句进行调试 PRINT @sql; -- 执行删除存储过程的 SQL 语句 EXEC sp_executesql @sql;
删除输出库中,所有旧于7月10日的数据,则执行两个分步:
1:首先,需要识别所有表格中包含日期或时间类型字段的表格和字段。以下查询将帮助识别这些字段:
USE [mons]; -- 替换为你的数据库名称 SELECT t.name AS TableName, c.name AS ColumnName, ty.name AS DataType FROM sys.tables t INNER JOIN sys.columns c ON t.object_id = c.object_id INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id WHERE ty.name IN ('datetime', 'datetime2', 'date', 'smalldatetime', 'time') ORDER BY t.name, c.name;
2:基于识别的表格和字段,生成删除数据的 SQL 语句。以下脚本会创建动态 SQL 语句以删除所有日期字段中早于 2024-07-10
的数据。
USE [mons]; -- 替换为你的数据库名称 DECLARE @DateThreshold DATE = '2024-07-10'; DECLARE @sql NVARCHAR(MAX) = ''; -- 生成删除语句 SELECT @sql = @sql + 'DELETE FROM ' + QUOTENAME(t.name) + ' WHERE ' + QUOTENAME(c.name) + ' < ''' + CONVERT(NVARCHAR, @DateThreshold, 120) + ''';' + CHAR(13) + CHAR(10) FROM sys.tables t INNER JOIN sys.columns c ON t.object_id = c.object_id INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id WHERE ty.name IN ('datetime', 'datetime2', 'date', 'smalldatetime', 'time'); -- 输出 SQL 语句进行调试 PRINT @sql; -- 执行删除语句 EXEC sp_executesql @sql;