我正在学习 SQL Server 并试图了解 SQL Server 如何更新行。
据我了解,SQL Server首先对数据库加一个意向排它锁,然后对表加一个意向排它锁,然后对要更新的记录加一个更新锁。稍后,它将将该行上的更新锁转换为排他锁,以便可以修改该行中的数据。
但问题是共享锁与更新锁兼容。因此,虽然该行有更新锁,但其他会话仍然可以使用共享锁读取该行。如果行上有共享锁,则无法将更新锁转换为排它锁,因为共享锁和排它锁不兼容。
这是否意味着如果有会话连续读取该行,SQL Server 根本没有机会更新该行。这种情况可能会持续很长一段时间。这是真的?SQL Server 会等到该行上没有共享锁时才开始更新其中的数据吗?
我所说的“连续”是指一个会话读取该行,并且在从该行释放共享锁之前,另一个会话在同一行上放置一个共享锁。在第二个共享锁从该行释放之前,另一个会话在同一行上放置另一个共享锁,依此类推。因此,基本上,该行上总是至少有一个共享锁。
我有一张桌子叫做座位,它有这样的架构
身份证号
对于每个用户,我取一个随机未使用的 id 并分配给该用户,这里为简单起见,我使已使用 =1。我正在使用的查询
update seats u inner join (
SELECT id from seats
where taken is null limit 1) s
on s.id = u.id set taken = 1;
Run Code Online (Sandbox Code Playgroud)
此查询随机获取一个带有标记为空的席位,对于该席位,它使标志为 1。虽然此查询工作正常,但此线程安全吗?
考虑这种情况,我有两个并行的用户。对于 user1,我选择第 X 行,就在运行更新查询之前,user2 签入,对于该用户,select 查询返回与 user1 相同的行。所以我将结束两次更新同一行。
此查询是否可能出现这种情况?
我想知道是否可以覆盖 MySQLDELETE命令的功能来更新所选行上的字段而不是完全删除它。
这使得可以设置一个标志,例如deletedfrom 0/ nullto 1,而不使用UPDATE。
是否可以这样做,如果可以,如何做?
Microsoft 提供主机两个存储库,
在这种情况下,GDR 代表什么。
SQL Server 2016 SP1 的 GDR 更新包
你也可以在这里看到。
是否可以在 T-SQL 更新语句中覆盖相同的磁盘地址?出于安全或匿名原因,用例将阻止恢复磁盘上的原始文本。
CREATE TABLE Test(
Id int,
Message nvarchar(1000))
GO
INSERT INTO Test (Id, Message) VALUES (1, 'Hello!')
GO
Run Code Online (Sandbox Code Playgroud)
所以在这一点上,“你好!” 写入磁盘。如果运行更新语句,是否可以保证(或至少很有可能)覆盖磁盘上的相同位置?
UPDATE Test SET Message = '000000' WHERE Id = 1
GO
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 实现中,原始 'Hello!' 的概率是多少?价值将不再在磁盘上?
我假设新值的大小相同。我的猜测是,如果新值的大小不同,那么 SQL Server 会将更新后的值写入新位置,留下“你好!” 在原来的位置,但现在标记为免费。我还假设删除对磁盘上的原始值没有任何影响,而只是将该位置标记为空闲。
如果情况并非如此,或者不能保证,或者至少很有可能,是否有另一种方法可以从磁盘中删除该值?
这里的要求不是达到保护政府机密安全的程度。这更像是一种营销声明,即已删除的项目确实已经消失并且无法恢复。
我知道这里有很多警告。我知道 SQL 语言没有解决这个问题。我特别询问 SQL Server 的实现。答案可能是它是不可知的。只是想知道是否有文档或常识,或者是否有人测试了实现细节。
我们正在使用不加密 SQL Server 磁盘的托管服务。我们在写入数据库之前对值进行加密。只是在研究“腰带和牙套”解决方案。
我们有现有的表:
| id | name | color | calories |
------------------------------------------
| 1 | apple | red | 20 |
| 2 | orange | orange | 10 |
| 3 | grapes | green | 5 |
| 4 | bananas | yellow | 15 |
| 5 | plum | purple | 25 |
------------------------------------------
Run Code Online (Sandbox Code Playgroud)
列id 是唯一的主键。我在编辑/更新记录时遇到了问题,当我注意更改例如第 3 行,id = 3到id = 5第 5 行,id = 5到id = 3...就像在第 …
想象一下,我在 Postgres 13 中有一个像这样的表:
CREATE TABLE public.people (
id integer PRIMARY KEY,
full_name character varying(255),
bio text
);
Run Code Online (Sandbox Code Playgroud)
然后,我插入一行包含足够字符的行,以便将简介写入 TOAST 表:
# insert into people values (1, 'joe user', (SELECT array_to_string(ARRAY(SELECT chr((65 + round(random() * 25)) :: integer) FROM generate_series(1,4000)), '')));
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)
最后,我更新该行而不更改 TOAST 列:
# update people set full_name='jane user' where id=1;
UPDATE 1
Run Code Online (Sandbox Code Playgroud)
是否UPDATE更改关联 TOAST 表中的任何行(或根本需要任何写入)?
上下文:我正在处理一些每秒有数千个事务的数据库表,并且观察到服务器上的写入负载非常高。我想知道UPDATETOAST 中具有较大值但 TOAST 值本身大部分不变的元组是否会增加写入负载并且值得优化。
我正在使用一个带有大型 TEXT 字段的 PostgreSQL 表,理论上该表会定期更新。我曾考虑过将数据直接存储在文件系统中,但使用 TOAST 时,数据已经存储在页外并压缩在数据库中,所以我想我会让事情变得简单,只使用数据库存储。
为了提供一些背景信息,我正在为 RSS 提要建立索引。我将每 24 小时运行一个脚本来提取 RSS 源并可能更新表格。这可能会导致大量死元组,从而占用大量磁盘空间。当然,autovacuum 最终会处理这个问题,但它可能会产生大量数据(很多 GB),我想确保我知道当我在这个非常大的表上进行大量更新时会发生什么。
我的一个解决方案是仅在提要发生某些重大更改(例如网站上出现新帖子)时才更新 TEXT 字段(存储 RSS 数据)。这意味着我可以避免进行更新,除非确实必须这样做。但是,我仍然想更新该表(以跟踪我最近执行 HTTP 请求的时间)。这将使用旧版本的行数据创建一个死元组。
如果 TEXT 数据实际上没有改变,会发生什么情况?当 UPDATE 创建死元组时,它还会复制 TEXT 数据吗?或者 TEXT 数据会保持不变,因为它没有更改并且存储在页外?
我对 SQL 查询没有太多经验,我正在尝试从错误中学习和理解。我有两张桌子:
CREATE TABLE #TempTest
(Id INT,
Number INT)
CREATE TABLE #TempTest2
(Id INT,
MaxNo INT,
MinNo INT)
INSERT INTO #TempTest VALUES (1,4)
INSERT INTO #TempTest VALUES (1,6)
INSERT INTO #TempTest VALUES (1,9)
INSERT INTO #TempTest VALUES (1,7)
INSERT INTO #TempTest VALUES (1,3)
INSERT INTO #TempTest VALUES (1,1)
INSERT INTO #TempTest VALUES (1,5)
INSERT INTO #TempTest2 VALUES (1,0,10)
Run Code Online (Sandbox Code Playgroud)
我正在尝试更新MaxNo第一个表中最大数小于 8 且MinNo最小数大于 1 的列:
UPDATE t2
SET MaxNo = IIF(t1.Number>t2.MaxNo AND t1.Number<8,t1.Number, t2.MaxNo),
MinNo = IIF(t1.Number<t2.MinNo …Run Code Online (Sandbox Code Playgroud) 我想交换表中两列的值,我发现在 SQL 中我们可以通过使用 Update 来做到这一点:
update the_table set first_name = last_name, last_name = first_name;
Run Code Online (Sandbox Code Playgroud)
它有效但我想知道 SQL 如何能够做到这一点而不覆盖其他列中的列中的数据?
update ×10
sql-server ×4
mysql ×3
locking ×2
postgresql ×2
autovacuum ×1
blocking ×1
delete ×1
disk-space ×1
linux ×1
storage ×1
t-sql ×1
terminology ×1
vacuum ×1