Questions tagged «truncate»

快速删除所有行的DDL操作。

6
为什么同时使用TRUNCATE和DROP?
在我工作的系统中,有许多使用临时表的存储过程和SQL脚本。使用这些表后,删除它们是一个好习惯。 我的许多同事(几乎所有的同事都比我经验丰富)通常会这样做: TRUNCATE TABLE #mytemp DROP TABLE #mytemp 我通常DROP TABLE在脚本中使用一个。 是否有充分的理由在a TRUNCATE之前立即进行DROP?


2
为什么DELETE对性能有持续的影响?
最后是一个测试脚本,用于比较@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 只是为了确保我理智,这表明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 当使用DELETE清除表时,在第一次运行和随后的运行之间的跳转中,这是非常一致的。我对DELETE的了解缺少什么?我已经重复了很多次,交换了命令,调整了tempdb的大小,使其不需要增长等。 CREATE TABLE …


2
为什么截断DDL?
我有一个面试问题,在面试过程中被问到。我回答了这个问题,但是面试官对我的回答并不那么确信。那么,有人请以我的理解纠正我吗? 问:为什么截断是DDL,而删除是DML?两者都做几乎相同的工作(删除行) Ans。当我们使用Truncate时,我们将取消分配数据分配的整个空间,而不保存到undo-table-space中。但是,在Delete的情况下,我们将所有数据放入undo表空间,然后删除所有数据。 请,如果有人知道上述最佳答案,请解释。
15 oracle  delete  ddl  truncate 

1
为什么在存储过程的末尾截断临时表以更快地创建其可用的tempdb空间?
SQL Server缓存在存储过程中创建的临时表,并仅在过程结束并随后执行时重命名它们。我的问题与何时释放tempdb空间有关。我已经知道该表在过程结束时被截断了。我已经读到评论说,这是基于每个会话进行处理的,并且看到了有关是否需要在MSDN上进行清理的问题。但是,如果它从未在同一会话中两次执行过,该怎么办? 我还听说过,有一个后台垃圾收集过程,一旦表超出范围,就会释放该空间。 尽管有相反的预期,但在创建存储过程的末尾截断一个临时表时,似乎导致该表在tempdb中用于释放数据的空间比没有使用truncate语句时要快。为什么? 使用或不使用这样的截断语句对性能的影响是什么?使用SNAPSHOT隔离时,经常会感到tempdb压力,我认为尽快从大型temp表中释放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] …

1
PostgreSQL:TRUNCATE后未释放磁盘空间
我有TRUNCATE一个巨大的表(〜120Gb),名为files: TRUNCATE files; VACUUM FULL files; 表大小为0,但没有释放磁盘空间。有什么想法如何找回丢失的磁盘空间吗? 更新: 大约12个小时后释放了磁盘空间,我这边没有采取任何措施。我使用Ubuntu 8.04服务器。

1
事务隔离级别快照与截断?
我希望有人可以阐明我在SNAPSHOT隔离与TRUNCATE上没有想到的这种行为。 数据库:允许快照隔离= True;读取已提交快照快照= False。 Procedure1(从具有大量连接的长时间运行的复杂SELECT替换表foo的内容): BEGIN TRAN; TRUNCATE TABLE foo; INSERT INTO foo SELECT...; COMMIT; Procedure2(从表foo中读取): SET TRANSACTION ISOLATION LEVEL SNAPSHOT; SELECT * FROM foo; 如果在执行Procedure2的同时正在运行Procedure1,则过程2将等待LCK_M_SCH_S(根据sp_WhoIsActive)等待,直到Procedure1完成。而当Procedure2确实完成时,它将引发此异常: 快照隔离事务在数据库'DatabaseName'中失败,因为自该事务开始以来,该语句访问的对象已由另一个并发事务中的DDL语句修改。不允许这样做,因为未对元数据进行版本控制。如果同时进行元数据更新和快照隔离,则可能导致不一致。 但是,Microsoft并未将TRUNCATE列为SNAPSHOT隔离下不允许的DDL语句:http : //msdn.microsoft.com/zh-cn/library/bb933783.aspx 显然,我并没有正确理解某些东西,因为我希望程序2的最佳情况会在TRUNCATE之前立即返回表中最近提交的数据,或者最坏的情况是被程序1阻止,然后返回程序的新内容。表。你能帮我吗?

1
是什么导致TRUNCATE TABLE花费很长时间?
我正在运行具有主/从复制(1个主,2个从)的MySQL5.5。 我有一个每周运行一次并截断特定表的过程。该表不是很大,只有几千条记录。 出于某种原因,该TRUNCATE TABLE命令的执行时间非常长(在主机和从机上)。执行大约需要40万毫秒!当它在从属服务器上运行时,它将导致它滞后于主服务器。在后TRUNCATE TABLE结束,一切恢复正常。 我知道一个从站在执行时没有收到任何读取,TRUNCATE TABLE因为它是一个专用的从站,并且从该从站读取的进程已关闭。同样,在该从站上,执行所花费的时间相同。 表格结构如下:http : //pastebin.com/qEQB4juR 关于如何加快TRUNCATE TABLE的任何想法?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.