SQLSERVER的truncate和delete有区别吗?

在 SQL Server 里,TRUNCATE TABLE 和 DELETE 这两个操作虽然都能把表里的数据清空,但它们的工作方式和影响是不同的。

先说说 DELETE,这其实是个数据操作语言(DML)命令,你用它可以删除表里的一部分数据。
当执行 DELETE 时,SQL Server 会为每一行被删除的数据都记录在事务日志里,这样万一操作出错了,你还可以把数据给恢复回来。
不过,这种记录每一行数据的做法也会让事务日志变得越来越大。

再来看 TRUNCATE TABLE,这是一个数据定义语言(DDL)命令,它的作用更像是重新定义了这个表。
当你执行 TRUNCATE TABLE 时,SQL Server 只是在日志里记录一下这个表被清空了,而不会记录每一行数据的具体变化。
这样做的好处是,产生的日志非常少,对性能的影响也小。

在数据页的处理上,DELETE 会移除数据页里的 slot 指针,但页面本身还留着,系统会通过 PFS(页文件空间)来记录哪些页面还有空间可用。
而 TRUNCATE TABLE 更像是把表和它的数据页“断开”了,然后通过 GAM(全局分配映射)来管理这些被释放的空间。

说到使用场景,如果你只是想删除表里的一部分数据,并且还希望有回滚的能力,那 DELETE 可能更适合。
但如果你需要清空整个表,并且不希望事务日志变得太庞大,那么 TRUNCATE TABLE 是个更好的选择。
特别是当你要删除大量数据时,TRUNCATE TABLE 通常会比 DELETE 快很多,而且对日志的影响也更小。

总的来说,用 TRUNCATE TABLE 还是 DELETE,得看你具体的需求。
如果只是想清空表,不太在意日志的细节,那 TRUNCATE TABLE 通常是更优的选择。

centos下sqlserver日志查看

Hey,CentOS系统下的SQLServer日志查看小技巧来啦!这里有三种方法,快来看看哪种最适合你吧。

1 . 图形化工具大法
如果你已经安装了图形化工具,比如SSMS或者VSCode插件,那这个方法就太适合你了。
首先,用SSMS或VSCode插件连接到SQLServer实例,然后在对象资源管理器里找到“SQLServer日志”节点。
你可以轻松浏览、筛选和导出日志内容。
界面直观,适合复杂筛选和长期监控,但缺点是必须依赖图形化环境,不适用于纯命令行服务器。

2 . 命令行小能手sqlcmd
没有图形化环境或者需要快速查询日志?那就试试sqlcmd吧。
首先安装sqlcmd,然后连接到SQLServer,执行EXECxp_readerrorlog命令查看错误日志。
还能通过添加参数来精准筛选日志,比如查看特定错误或失败记录。
不需要图形化环境,还能支持脚本自动化处理,但缺点是需要熟悉SQL命令,过滤功能相对简单。

3 . 原始日志直接看
直接分析原始日志或者排查特定问题?那就直接查看日志文件吧。
SQLServer默认日志路径在/var/opt/mssql/log/,主要文件有errorlog、errorlog.1 、errorlog.2 等。
你可以用tail-f实时追踪日志,用less分页查看,或者用grep搜索关键词。
直接操作原始文件,灵活性高,适合深度排查,但需要熟悉Linux命令,日志格式是纯文本,需要手动解析。

注意事项

查看日志文件需要sudo权限,确保你有权限访问/var/opt/mssql/log/。

SQLServer会自动轮转日志文件,历史日志以.1 、.2 等后缀命名,排查问题时要检查所有相关文件。

如果需要更复杂的日志过滤,比如时间范围或多关键词组合,建议用awk或编写脚本处理。

总结

快速查看:优先使用sqlcmd执行xp_readerrorlog,适合基础查询。

实时监控:用tail-f跟踪日志动态变化。

深度分析:结合less和grep直接操作日志文件,灵活筛选关键信息。

自动化脚本:将常用命令封装为脚本,定期执行或集成到监控系统中。