在我工作的系统中有很多使用临时表的存储过程和 SQL 脚本。使用这些表后,最好删除它们。
我的许多同事(几乎所有人都比我更有经验)通常会这样做:
TRUNCATE TABLE #mytemp
DROP TABLE #mytemp
Run Code Online (Sandbox Code Playgroud)
我通常DROP TABLE在我的脚本中使用单个。
在 aTRUNCATE之前立即执行 a 有什么好的理由DROP吗?
我只剩下 2GB 了,所以我需要删除这个历史表。该表现在为空,但数据库磁盘空间未释放。并且数据库文件是320GB。
最后是一个测试脚本,用于比较@table 变量和#temp 表之间的性能。我想我已经正确设置了 - 性能计时是在 DELETE/TRUNCATE 命令之外进行的。我得到的结果如下(以毫秒为单位)。
@Table Variable #Temp (delete) #Temp (truncate)
--------------- -------------- ----------------
5723 5180 5506
15636 14746 7800
14506 14300 5583
14030 15460 5386
16706 16186 5360
Run Code Online (Sandbox Code Playgroud)
只是为了确保我是理智的,这表明 CURRENT_TIMESTAMP (aka GetDate()) 是在语句时使用的,而不是批处理时,因此 TRUNCATE/DELETE 与SET @StartTime = CURRENT_TIMESTAMP语句之间不应有交互。
select current_timestamp
waitfor delay '00:00:04'
select current_timestamp
-----------------------
2012-10-21 11:29:20.290
-----------------------
2012-10-21 11:29:24.290
Run Code Online (Sandbox Code Playgroud)
当使用 DELETE 清除表时,第一次运行和后续运行之间的跳转非常一致。我对DELETE 的理解缺少什么?我已经重复了很多次,交换了顺序,调整了 tempdb 的大小以使其不需要增长等。
CREATE TABLE #values (
id int identity primary key, -- will be clustered …Run Code Online (Sandbox Code Playgroud) 在级联上截断表时,有什么方法可以重置所有表序列。
我已经阅读了这篇文章如何在 postgres 中重置序列并用新数据填充 id 列?
ALTER SEQUENCE seq RESTART WITH 1;
UPDATE t SET idcolumn=nextval('seq');
Run Code Online (Sandbox Code Playgroud)
它仅适用于一个序列,但我的问题是重新启动截断表的所有序列。
考虑当我使用TRUNCATE sch.mytable CASCADE;它影响3个相关表,这意味着三个序列,是否有任何解决方案可以一次性重新启动此序列。
我需要截断一个包含 170 亿行的表,该表位于作为 AG 一部分的数据库中。
此操作对 AG 延迟和日志备份大小有什么影响?
有推荐的方法吗?
我有一个对数据库具有以下权限的 SQL 帐户:

db_executor您看到此帐户所属的角色是由以下脚本创建的:
CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO
GRANT EXECUTE TO [db_executor]
GO
Run Code Online (Sandbox Code Playgroud)
当我运行一个select,update,insert或delete放在桌子上,它工作正常。当我尝试truncate桌子时,它给了我这个错误信息:
找不到对象“TableName”,因为它不存在或您没有权限。
此帐户缺少什么权限?
我们的空间快用完了。清除错误日志的安全方法是什么?

我有一个面试问题,这是我面试时问的。我回答了这个问题,但面试官对我的回答并不那么信服。所以,有人请用我的理解纠正我吗?
问:为什么 Truncate 是 DDL 而 Delete 是 DML?两者都做几乎相同的工作(删除行)
答。当我们使用 Truncate 时,我们正在取消分配由数据分配的整个空间,而不保存到撤消表空间中。但是,在删除的情况下,我们将所有数据放入撤消表空间,然后删除所有数据。
请,如果有人知道上述最佳答案,请解释。
我有TRUNCATE一个巨大的(~120Gb)表,名为files:
TRUNCATE files;
VACUUM FULL files;
Run Code Online (Sandbox Code Playgroud)
表大小为 0,但没有释放磁盘空间。任何想法如何回收我丢失的磁盘空间?
更新: 磁盘空间在大约 12 小时后释放,我这边没有任何操作。我使用 Ubuntu 8.04 服务器。
SQL Server 缓存在存储过程中创建的临时表,并且仅在过程结束和随后执行时重命名它们。我的问题与 tempdb 空间何时被释放有关。我读到该表在程序结束时被截断。我在评论中读到这是在每个会话的基础上处理的,并且在 MSDN上看到了一个关于是否需要清理的问题。但是如果它从来没有被同一个会话执行过两次呢?
我还听说有一个后台垃圾收集进程,一旦表超出范围,就会释放该空间。
在创建它的存储过程结束时截断临时表似乎会导致表在 tempdb 中用于数据的空间比不使用 truncate 语句时释放的空间更快,尽管与预期相反。为什么?
使用或不使用这种截断语句的相对性能影响是什么?使用 SNAPSHOT 隔离时,tempdb 经常受到压力,我认为尽快从大型临时表中释放 tempdb 中使用的空间将防止 tempdb 不必要的增长。这种潜在的空间节省是否会以性能为代价?
这是一些重现问题的代码(主要来自@TheGameiswar,有一些更改):
SET NOCOUNT ON;
GO
ALTER PROC usp_test
AS
BEGIN
IF object_id('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
SELECT *
INTO #temp
FROM [dbo].[Event_28] -- This is a table with 15313 rows, using 35648 KB according to sp_spaceused
--SELECT SUM(user_object_reserved_page_count) AS [user object pages used]
-- ,(SUM(user_object_reserved_page_count) * 1.0 / 128) …Run Code Online (Sandbox Code Playgroud) sql-server stored-procedures truncate tempdb temporary-tables
truncate ×10
sql-server ×7
delete ×2
disk-space ×2
postgresql ×2
ddl ×1
errors ×1
oracle ×1
performance ×1
permissions ×1
sequence ×1
sybase ×1
tempdb ×1