如果要删除某个表空间中的一个数据文件如何 *** 作

如果要删除某个表空间中的一个数据文件如何 *** 作,第1张

1、先对数据进行一次完整的备份。

2、备份之后删除数据库中其中一个表空间,并删除与之相对应的数据文件。

3、然后使用刚刚的备份进行恢复发现出现如下图的错误。

4、然后根据错误提示查询错误原因,发现需要在数据库关闭或者read only情况下才可以进行恢复,所以关闭数据库启动到mount状态。

5、然后再使用rman命令进行恢复即可。

它将冗余数据选择到一个游标中 并根据(LastName FirstName)来分组(在我们这个方案中) 然后打开游标然后循环地取出每一行 然后用与先前的取出的键值进行比较 如果这是第一次取出这个值 或者这个值不是冗余键 那么跳过这个记录然后取下一个 不然的话 这就是这个组中的冗余记录 所以删掉它.

让我们运行一下这个存储过程

BEGIN

DeleteDuplicates

END

/

SELECT LastName FirstName COUNT(*)

FROM Customers

GROUP BY LastName FirstName

HAVING COUNT(*) >

最后一个查询语句没有返回值 所以冗余数据没有了从表中取冗余数据的过程完全是由定义在csr_Duplicates 这个游标中的SQL语句来实现的 PL/SQl只是用来实现删除冗余数 那么能不能完全用SQL语句来实现呢?

二.SQL解决方案 使用RANK()删除冗余数据Oracle i分析函数RANK()来枚举每一个组中的元素 在我们的方案中  我们应用这个方案 我们使用这个函数动态的把冗余数据连续的排列起来加上编号 组由Partintion by 这个语句来分开 然后用Order by 进行分组SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) SeqNumber

FROM Customers

ORDER BY LastName FirstName

SQL

Listing Output of single SQL statement that uses RANK()

显示的是根据记录的条数的个数来显示尤其对于冗余数据

ID LASTNAME FIRSTNAME SEQNUMBER

Blake Becky

Blue Don

Bradley Tom

Chang Jim

Griffith David

Hill Larry

King Chuck

Krieger Jeff

Krieger Jeff

Krieger Jeff

Loney Julie

Lord Don

Mason Paul

Monroe John

Simon Michael

Simon Michael

Stone Tony

Stone Tony

Stone Tony

Stone Tony

Stone Tony

我们可以看一到 SeqNumber这一列中的数值 冗余数据是根据ID号由小到大进行的排序 所有的冗余数据的SqlNumber都大于一 所有的非冗余数据都等于一 所以我们取自己所需 删除那么没用的SELECT ID LastName FirstName

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) AS SeqNumber

FROM Customers)

WHERE SeqNumber >

SQL

Listing 冗余键的键值

有七行必须被删除

ID LASTNAME FIRSTNAME

Krieger Jeff

Krieger Jeff

Simon Michael

Stone Tony

Stone Tony

Stone Tony

Stone Tony

rows selected 这显示有七行需要删除 还是用上一个表我测试了一下这个代码 它用了77秒种就删除了所有的数据准备好了用Sql语句来删除冗余数据 版本一它执行了 秒

DELETE

FROM CUSTOMERS

WHERE ID IN

(SELECT ID

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) AS SeqNumber

FROM Customers)

WHERE SeqNumber >)

我们可以看到最后的两行语句对表中的数据进行了排序 这不是有效的 所以我们来优化一下最后一个查询语句 把Rank()函数应用到只含有冗余数据的组 而不是所有的列下面这个语句是比较有效率的 虽然它不像上一个查询那样精简SELECT ID LastName FirstName

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) AS SeqNumber

FROM

(SELECT ID LastName FirstName

FROM Customers

WHERE (LastName FirstName) IN (SELECT LastName FirstName

FROM Customers

GROUP BY LastName FirstName

HAVING COUNT(*) >)))

WHERE SeqNumber >

选择冗余数据只用了26秒钟 这样就提高了 %的性能 这样就提高了将这个作为子查询的删除查询的效率

DELETE

FROM Customers

WHERE ID IN

(SELECT ID

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) AS SeqNumber

FROM

(SELECT ID LastName FirstName

FROM Customers

WHERE (LastName FirstName) IN (SELECT LastName FirstName

FROM Customers

GROUP BY LastName FirstName

HAVING COUNT(*) >)))

WHERE SeqNumber >)

现在只用了 秒钟的就完成的上面的任务 比起上一个 秒 这是一个很大的进步 相比之下 存储过程用了 秒 这样存储过程有些慢了使用PL/SQL语句我们和我们以上的代码 会得到更好的更精确的代码 和提高你代码的执行效率 虽然对于从数据库中枚举数据PL/SQL对于Sql两者没有什么差别 但是对于数据的比较上 PL/SQL就比SQL要快很多 但是如果冗余数据量比较小的话 我们尽量使用SQL而不使用PL/SQL如果你的数据表没有主键的话 那么你可以参考其它技术

Rank()其它的方法

使用Rank()函数你可以对选择你所保留的数据 (或者是小ID的或者是大ID 的 就由RECDate这个列来决定这种情况下 你可以把REcdate加入到(Orderby )子句中 倒序或者正序

这是一种保留最大Id的一种解决方案

DELETE

FROM Customers

WHERE ID IN

(SELECT ID

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName FirstName ORDER BY RecDate DESC ID) AS SeqNumber

FROM

(SELECT ID LastName FirstName RecDate

FROM Customers

WHERE (LastName FirstName) IN (SELECT LastName FirstName

FROM Customers

GROUP BY LastName FirstName

HAVING COUNT(*) >)))

WHERE SeqNumber >)

这种技术保证了你可以控制每一个表中的保留的组 假设你有一个数据库 有一个促销或者有一个折扣信息 比如一个团体可以使用这种促销5次 或者个人可以使用这个折扣三次 为了指出要保留的组的个数 你可以在where 和having子句中进行设置 那么你将删除所有大于你

设置有数的冗余组

DELETE

FROM Customers

WHERE ID IN

(SELECT ID

FROM

(SELECT ID LastName FirstName RANK() OVER (PARTITION BY LastName

FirstName ORDER BY ID) AS SeqNumber

FROM

(SELECT ID LastName FirstName

FROM Customers

WHERE (LastName FirstName) IN (SELECT LastName FirstName

FROM Customers

GROUP BY LastName FirstName

HAVING COUNT(*) >)))

WHERE SeqNumber >)

As you can see using the RANK() function allows you to eliminate duplicates in a

single SQL statement and gives you more capabilities by extending the power of

your

queries

lishixinzhi/Article/program/Oracle/201311/18979

Sql Server中清空所有数据表中的记录

清空所有数据表中的记录:

复制代码 代码如下:

exec sp_msforeachtable @Command1 ='truncate table ?'

删除所有数据表:

复制代码 代码如下:

exec sp_msforeachtable 'delete N''?'''

清空SQL Server数据库中所有表数据的方法(有约束的情况)

其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除 *** 作可能陷入死循环,二是这里使用了微软未正式公开的sp_MSForEachTable存储过程。

也许很多读者朋友都经历过这样的事情:要在开发数据库基础上清理一个空库,但由于对数据库结构缺乏整体了解,在删除一个表的记录时,删除不了,因为可能有外键约束,一个常见的数据库结构是一个主表,一个子表,这种情况下一般都得先删除子表记录,再删除主表记录。

说道删除数据记录,往往马上会想到的是delete和truncate语句,但在遇到在两个或多个表之间存在约束的话,这两个语句可能都会失效,而且最要命的是这两个命令都只能一次 *** 作一个表。那么真正遇到要删除SQL Server数据库中所有记录时,该怎么办呢?有两个选择:

1.按照先后顺序逐个删除,这个方法在表非常多的情况下显得很不现实,即便是表数量不多,但约束比较多时,你还是要花费大量的时间和精力去研究其间的约束关系,然后找出先删哪个表,再删哪个表,最后又删哪个表。

2.禁用所有约束,删除所有数据,最后再启用约束,这样就不用花时间和精力去研究什么约束了,只需要编写一个简单的存储过程就可以自动完成这个任务。

复制代码 代码如下:

CREATE PROCEDURE sp_DeleteAllData

AS

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'

EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'

EXEC sp_MSForEachTable 'DELETE FROM ?'

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'

EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'

GO

从这两个选择中不难看出第二个选择是最简单有效的了,那么在使用第二个选择时,具体该怎么实施呢?

首先得编写代码循环检查所有的表,这里我推荐一个存储过程sp_MSForEachTable,因为在微软的官方文档中没有对这个存储过程有描述,很多开发人员也许都还未曾听说,所以你在互联网上搜索得到的解决办法大多很复杂,也许有的人会认为,既然没有官方文档,这个存储过程可能会不稳定,打心理上会排斥它,但事实并非如此。下面来先看一个完整的脚本:

这个脚本创建了一个命名为sp_DeleteAllData的存储过程,前面两行语句分别禁用约束和触发器,第三条语句才是真正地删除所有数据,接下里的语句分别还原约束和触发器,最后一条语句是显示每个表中的记录,当然这条语句也可以不要,我只是想确认一下是否清空了所有表而已。

你可以在任何数据库上运行这个存储过程,当然不要在生成数据库上运行,可别怪我没告诉你!不管怎样,还是先备份一下数据库,使用备份数据库还原,然后再运行该存储过程,呵呵,即使是一个大型数据库,也要不多长时间,你的数据库就成一个空库了

第三种方法:TRUNCATE TABLE

在sql server数据库中快速删除记录,清空表若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速、无日志记录的方法。TRUNCATE TABLE 与不含有 WHERE 子句的 DELETE 语句在功能上相同。但是,TRUNCATE TABLE 速度更快,并且使用更少的系统资源和事务日志资源。

与 DELETE 语句相比,TRUNCATE TABLE 具有以下优点:

所用的事务日志空间较少。

DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放。

使用的锁通常较少。

当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和页,而不是锁定各行。

如无例外,在表中不会留有任何页。

执行 DELETE 语句后,表仍会包含空页。例如,必须至少使用一个排他 (LCK_M_X) 表锁,才能释放堆中的空表。如果执行删除 *** 作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除 *** 作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。

与 DELETE 语句相同,使用 TRUNCATE TABLE 清空的表的定义与其索引和其他关联对象一起保留在数据库中。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6936810.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-30
下一篇2023-03-30

发表评论

登录后才能评论

评论列表(0条)

    保存