对检查表的记录上次更新、修改或删除时间的一些研究使我找到了称为 ora_rowscn 的伪列。
首先,我这样做:
select max(ora_rowscn) from tablename;
我记下了这个数字。然后我执行插入、更新和删除,检查每个之前和之后的最大值。它似乎随着每种类型的变化而增加。
如果您想知道我为什么要这样做,我们会在 C# windows 服务中缓存实体列表。此服务在两个负载平衡的服务器上运行,因此每个服务器都有一个单独的实例运行。当服务器 A 上发生更新时,服务器 B 需要知道它。我想要做的是将 max(ora_rowscn) 缓存到一个变量中。每次我们的应用程序插入、更新或删除一条记录时,它都会从数据库中获得一个新的最大值。如果值不同,那么它显然知道它需要从数据库中获取一个新列表。
所以我的实际问题是:是否还有其他我应该注意的问题可能会导致插入、更新或删除记录而不增加该值?
编辑:有人可以添加ora_rowscn为标签吗?
我在 MySQL 5.5(Windows XP x64)上有一个很大的 MyISAM 表,我必须在上面运行DELETE LOW_PRIORITY查询。当没有客户端访问表时,是否立即DELETE LOW_PRIORITY使SELECT语句对语句不可见并实际从磁盘中删除行,或者是否延迟删除可见性?
我有一个需要很长时间的删除查询。查看执行计划,我看到删除查询中的大部分估计成本都位于数据模型的一部分中,该部分具有大量数据(例如 400k 行),这看起来不错,但我不明白一件事.
数据模型的精简视图:
table ParentObject
int parentObjectId (PK)
table Child
int childId (PK)
int parentId (FK)
<stuff>
table GrandChild
int grandChildId (PK)
int childId (FK)
<more stuff>
Run Code Online (Sandbox Code Playgroud)
其中父对象可能有 200,000 个子对象,而子对象有 2 个左右的 GrandChildren。我对调整以下性能感兴趣:
DELETE FROM ParentObject WHERE parentObjectId = %d;
Run Code Online (Sandbox Code Playgroud)
在 Grandchild 上,(childId, + 两个其他列) 以及主键索引上有一个额外的非聚集索引。在 child 上有一个额外的非聚集唯一索引(parentId,+ 两个其他列)。
我在查询计划中看到的是,在删除 Grandchild 对象时,有两个昂贵的排序操作与删除混合在一起,我不明白它们为什么存在。
我应该注意什么来帮助这个删除操作更快?需要排序吗?如果我对 id 进行非规范化并将父 ID 添加到孙子表中会有所帮助吗?我是否愚蠢地建立了索引?
performance foreign-key sql-server delete sql-server-2008-r2 performance-tuning
我目前在 PostgreSQL 中有一个函数,它创建一个临时表,填充它,执行一些棘手的选择并返回结果。postgresql 的临时表是函数的本地表,因此这有助于我避免在临时表中引入另一列来标记由函数的特定执行插入的所有行。如果我使用了一个需要的全局表,并且由于我的查询的性质,它会降低性能。
我想将这段代码移植到 VoltDB,但它不支持从存储过程创建临时表。这让我想到了其他方法。如果存储过程将启动一个事务并删除表中的所有行(不是临时表),那么此时运行的同一存储过程的其他执行会发生什么情况?
或者如果在删除之后,存储过程开始插入行,而另一个会话调用相同的 sp,它将再次删除所有行,那怎么办?
简而言之,我可以通过删除所有行,插入一些行,然后对插入的行执行查询,然后在 sp 执行结束(和事务提交)之前再次删除所有行来创建事务中数据的本地(对 sp 执行)视图吗? )?
这将让我避免为临时行使用 rowset_id 列,避免更慢的连接(这是一个 EAV 实现)。
BOL 和许多其他来源指出:
FROM
是一个可选关键字,可以在 DELETE 关键字和目标 table_or_view_name 或 rowset_function_limited 之间使用。
我习惯写DELETE没有FROM. 我进行了一些搜索,但找不到FROM强制性的地方。任何人都可以指出应该强制执行的情况吗?还是总是可选的?
我有两个疑问:
第一个如下:
SELECT *
FROM batch bp
INNER JOIN sender_log sl ON sl.id=bp.log_id
AND bp.protocol='someprotocol'
Run Code Online (Sandbox Code Playgroud)
第二个查询用于删除行:
delete from batch where protocol='someprotocol'
Run Code Online (Sandbox Code Playgroud)
我知道在 postgres 中我们有RETURNING *来返回已删除的行。我想要实现的是删除行并在一个查询中返回它们。我怎样才能做到这一点?
假设我有一个person带有 id 和其他一些列的表。其他表person使用ON UPDATE CASCADE. 例如:
CREATE TABLE person (id int PRIMARY KEY);
CREATE TABLE sale (id int PRIMARY KEY,
person_id int REFERENCES person(id) ON UPDATE CASCADE);
Run Code Online (Sandbox Code Playgroud)
现在,我想要做的是:从 person 表中删除重复的条目,修复referencessale引用。例如,使用此数据:
INSERT INTO person values (1), (2), (3);
INSERT INTO sale VALUES (11, 1), (12, 2), (13, 3);
Run Code Online (Sandbox Code Playgroud)
Person1和2实际上是一样的,所以他们应该被“合并”。通过合并我的意思是不包括人2在更新的人引用1的sale表。
由于ON UPDATE CASCADE表上有一个引用person,我想知道是否有某种方法可以在不必手动更新sale表的情况下,在删除人的同时导致级联更新2
我在这里试图实现的是避免使用专用程序来更新引用,因为引用表的数量很可能会增加,需要在此过程中进行维护(并且已经相当大了)。
我需要删除给定表中的所有行。该表包含数百万或记录。主数据库被复制到多个从属数据库,我希望这样做不会造成复制延迟或影响性能。
经过一番研究,我试着放下桌子。这花了很长时间,在此期间我的主数据库被锁定。
我知道我可以分批逐步删除,只是想知道有没有更快的方法。
谢谢,Z
如果我填充下表:
IF OBJECT_ID ('dbo.CleanTableTest', 'U') IS NOT NULL
DROP TABLE dbo.CleanTableTest;
GO
CREATE TABLE dbo.CleanTableTest
(FileName nvarchar(4000),
DocumentSummary nvarchar(max),
Document varbinary(max)
);
GO
-- Populate the table with data from the Production.Document table.
INSERT INTO dbo.CleanTableTest
SELECT REPLICATE(FileName, 1000),
DocumentSummary,
Document
FROM Production.Document;
GO
exec sp_spaceused CleanTableTest
go
Run Code Online (Sandbox Code Playgroud)
结果:
name rows reserved data index_size unused
-------------- ---- --------- ------- ----------- ------
CleanTableTest 13 456 KB 440 KB 8 KB 8 KB
Run Code Online (Sandbox Code Playgroud)
但是如果我删除所有行:
delete dbo.CleanTableTest
go
exec sp_spaceused CleanTableTest
go
Run Code Online (Sandbox Code Playgroud)
结果: …
在这个方案中
id uid content
1 1 A
2 1 B
3 1 C
4 1 D
5 1 E
Run Code Online (Sandbox Code Playgroud)
如果用户决定他不需要这些行,id = 3, 4, 5是让他将其设置content为NULL还是删除该行更好?
这个过程发生了很多次而且他可能会NULL再次使用这些插槽。我是否仍然使用UPDATE并将其设置为NULL以防他将来更改它?还是只是DELETE整行?
问题是这样的:最好
DELETE行?INSERT| -> DELETE-> INSERT..DELETE->INSERT
或者
UPDATE行?INSERT| -> UPDATE to NULL-> UPDATE to value.. UPDATE to NULL->UPDATE to value
delete ×10
sql-server ×3
mysql ×2
performance ×2
postgresql ×2
update ×2
dynamic-sql ×1
foreign-key ×1
functions ×1
insert ×1
join ×1
locking ×1
mysql-5.5 ×1
oracle-10g ×1
replication ×1
select ×1
t-sql ×1
tablespaces ×1
transaction ×1
voltdb ×1