drop 和 truncate , drop 两种删除表的方式对比评测
来源:互联网 发布:c语言default语句 编辑:程序博客网 时间:2024/05/16 17:48
USE [master]GO--1. 创建测试库CREATE DATABASE [test] CONTAINMENT = NONE ON PRIMARY ( NAME = N'test', FILENAME = N'D:\database\2014\test.mdf' , SIZE = 8192KB , FILEGROWTH = 8192KB ) LOG ON ( NAME = N'test_log', FILENAME = N'D:\database\2014\test_log.ldf' , SIZE = 8192KB , FILEGROWTH = 8192KB )GO--2. 创建测试表USE testGOIF OBJECT_ID('tmp') IS NOT NULL DROP TABLE tmpGOCREATE TABLE tmp( id bigINT IDENTITY(1,1) PRIMARY KEY, n NVARCHAR(MAX) )GO--3. 插入1千万条测试数据SET NOCOUNT ONDECLARE @i INT,@iMax INTSET @iMax=10000000WHILE 1=1 BEGIN SELECT @i=COUNT(1) FROM tmp PRINT @i IF @i>=@imax BEGIN BREAK; END IF @i=0 BEGIN INSERT INTO tmp (n) VALUES(N'xxxxxxxxxxxxxxx') END IF @i<=@imax/2 BEGIN INSERT INTO tmp (n) SELECT n FROM tmp END ELSE BEGIN INSERT INTO tmp (n) SELECT TOP( @iMax-@i ) n FROM tmp ENDEND-- 1000 万数据也就 2 分 45 秒--4. 查看文件的大小EXEC sp_spaceused/*database_namedatabase_sizeunallocated spacetest1488.00 MB4.75 MBreserveddataindex_sizeunused511232 KB507272 KB3480 KB480 KB*/SELECT * FROM sys.sysfiles AS s/*fileidgroupidsizemaxsize growthstatusperfname filename1 164512-1 1024 2 0 test D:\database\2014\test.mdf2 0125952268435456 1024 66 0 test_logD:\database\2014\test_log.ldf*/--5. 备份数据库,便于测试对比BACKUP DATABASE test TO DISK =N'd:\database_bak\test20170919.bak' WITH COMPRESSION,STATS=20--6. 只做 drop 操作(不做truncate)DROP TABLE dbo.tmpEXEC sp_spaceused/*database_namedatabase_sizeunallocated spacetest1488.00 MB501.63 MBreserveddataindex_sizeunused2424 KB928 KB1096 KB400 KB*/SELECT * FROM sys.sysfiles AS s/*fileidgroupidsizemaxsizegrowthstatusperfnamefilename1 164512-1102420testD:\database\2014\test.mdf2 01259522684354561024660test_logD:\database\2014\test_log.ldf*/--7. 还原这个库, 重新测试--kill 指定库上的所有进程DECLARE @sql NVARCHAR(MAX)SET @sql=''SELECT @sql = @sql+ 'kill '+cast(spid AS VARCHAR(10))+';' FROM sys.sysprocesses AS s WHERE s.dbid=DB_ID('test') AND spid!=@@spidSET @sql=REPLACE(@sql,';','')PRINT @sqlEXEC (@sql)USE [master]GORESTORE DATABASE test FROM DISK=N'd:\database_bak\test20170919.bak' WITH FILE=1--8. 执行 truncate 和 drop USE testGOTRUNCATE TABLE dbo.tmpDROP TABLE dbo.tmpEXEC sp_spaceused/*database_namedatabase_sizeunallocated spacetest 1488.00 MB 501.63 MBreserveddataindex_sizeunused2424 KB936 KB1096 KB392 KB*/SELECT * FROM sys.sysfiles AS s/*fileidgroupidsizemaxsizegrowthstatusperfnamefilename1 164512-1102420testD:\database\2014\test.mdf2 01259522684354561024660test_logD:\database\2014\test_log.ldf*/--改为完全模式再试USE [master]GODECLARE @sql NVARCHAR(MAX)SET @sql=''SELECT @sql = @sql+ 'kill '+cast(spid AS VARCHAR(10))+';' FROM sys.sysprocesses AS s WHERE s.dbid=DB_ID('test') AND spid!=@@spidSET @sql=REPLACE(@sql,';','')PRINT @sqlEXEC (@sql)RESTORE DATABASE test FROM DISK=N'd:\database_bak\test20170919.bak' WITH FILE=1USE [master]GOALTER DATABASE [test] SET RECOVERY FULL WITH NO_WAITGOUSE testGODROP TABLE dbo.tmpEXEC sp_spaceused/*database_namedatabase_sizeunallocated spacetest1488.00 MB501.63 MBreserveddataindex_sizeunused2424 KB936 KB1096 KB392 KB*/SELECT * FROM sys.sysfiles AS s/*fileidgroupidsizemaxsizegrowthstatusperfnamefilename1 164512-1102420testD:\database\2014\test.mdf2 01259522684354561024660test_logD:\database\2014\test_log.ldf*/--再恢复再改完全用 truncate , drop 试USE [master]GODECLARE @sql NVARCHAR(MAX)SET @sql=''SELECT @sql = @sql+ 'kill '+cast(spid AS VARCHAR(10))+';' FROM sys.sysprocesses AS s WHERE s.dbid=DB_ID('test') AND spid!=@@spidSET @sql=REPLACE(@sql,';','')PRINT @sqlEXEC (@sql)RESTORE DATABASE test FROM DISK=N'd:\database_bak\test20170919.bak' WITH FILE=1USE [master]GOALTER DATABASE [test] SET RECOVERY FULL WITH NO_WAITGOUSE testGOTRUNCATE TABLE dbo.tmpDROP TABLE dbo.tmpEXEC sp_spaceused/*database_namedatabase_sizeunallocated spacetest1488.00 MB501.63 MBreserveddataindex_sizeunused2424 KB928 KB1096 KB400 KB*/SELECT * FROM sys.sysfiles AS s/*fileidgroupidsizemaxsizegrowthstatusperfnamefilename1 164512-1102420testD:\database\2014\test.mdf2 01259522684354561024660test_logD:\database\2014\test_log.ldf*/
本人测试版本为: 2014
实际上两种方式是一样的, 直接drop 并不会产生多少日志, truncate 再 drop 的做法可能在低版本(如2000)上是有效的。
阅读全文
0 0
- drop 和 truncate , drop 两种删除表的方式对比评测
- MySQL 三种删除方式的区别:delete truncate drop
- 删除表数据drop、truncate和delete的区别
- 删除表数据drop、truncate和delete的用法
- sqlserver---删除表数据drop、truncate和delete的用法
- drop和truncate的区别
- 删除数据--truncate和delete以及drop的用法
- 清空表数据和删除表truncate、delete、drop
- mysql删除表数据(drop、truncate和delete)
- mysql数据库中删除数据的三种形式 drop和 truncate 和 delete
- mysql truncate/delete/drop 删除表数据
- MySQL删除表数据:drop、truncate、delete
- oracle 中删除表 drop delete truncate
- oracle 中删除表 drop delete truncate
- truncate和不带where子句的delete, 以及drop都会删除表内的数据
- sql语句中----删除表数据drop、truncate和delete的用法
- sql语句中----删除表数据drop、truncate和delete的用法
- sql语句中----删除表数据drop、truncate和delete的用法
- wifi模块rtl8723b的驱动移植
- Spark之 cache 的坑
- Java 简易完成文件的复制、移动与删除
- 用easybcd引导ubuntu却进入grub命令行的遭遇与解决
- 王思聪发声遭回怼 李雨桐闺蜜再爆料王思聪力挺薛之谦被打脸
- drop 和 truncate , drop 两种删除表的方式对比评测
- 关于Socket创建失败,10093
- Ubuntu下搭建lnmp环境
- 第3周实践项目1 顺序表的基本运算
- java虚拟机安装操作和命令
- Xshell安装
- 读书笔记:数据结构与算法-Python语言描述【第2章:抽象数据类型和Python类】
- spring中扫描bean的源码解析
- 封装、构造