我遇到了一个死锁场景,死锁的唯一参与者似乎是一个表和一个从该表中删除的存储过程。我根据对其中几个死锁时的 sql 错误日志的分析得出了这个结论,并使用下面的 MSDN 文章作为破译错误日志中的跟踪的指南。
下面定义了表 DEXTable 和存储过程 ClearDEXTableRows。还有另一个存储过程 InsertDEXTableRow 将行插入 DEXTable,但是根据 sql 错误日志中的条目,该过程似乎没有涉及死锁。
DEXTable 中有大约 830 万行,并且趋于稳定增长。受访者表也很大,并且趋于稳定增长。
它是从具有频繁快速连续调用 ClearDEXTableRows 和 InsertDEXTableRow 的页面的高流量网站访问的。
在过去的 10 天内,每天发生 0 到 9 次死锁。
我已经为 1222(使用 DBCC TRACEON 1222)启用了 sql 跟踪,并且最近启用了标志 1204。在检测和结束死锁上有对这些标志的输出的很好的描述
只有这个存储过程 ClearDEXTableRows 是导致死锁的原因是否有意义?
如果是这样,任何人都可以很好地解释这种情况是如何发生的并推荐一种解决方法吗?
我怀疑 DELETE 语句导致 DEXTable 的 PK 争用需要经常重建。
如果没有,我应该启用哪些额外的跟踪来深入挖掘死锁的原因?(我想在这里学习)
-- Table definition
CREATE TABLE [dbo].[DEXTable](
[ExportID] [int] NOT NULL,
[RespondentID] [int] NOT NULL,
[Exported] [datetime] NOT NULL,
CONSTRAINT [PK_DEXTable] PRIMARY KEY CLUSTERED …Run Code Online (Sandbox Code Playgroud) 我有一张代表电影的表。这些字段是:
id (PK), title, genre, runtime, released_in, tags, origin, downloads。
我的数据库不会被重复的行污染,所以我想强制执行唯一性。问题是不同的电影可能有相同的标题,甚至除了tags和之外的相同字段downloads。如何实现唯一性?
我想到了两种方法:
downloads主键以外的所有字段。downloads因为它是 JSON,所以我一直在外面,它可能会影响性能。id作为主键保留,但为所有其他列添加唯一约束(再次除外downloads)。我读了这个非常相似的问题,但我不太明白我该怎么做。目前该表与任何其他表都没有关系,但将来可能会。
目前我的记录略少于 20,000 条,但我预计这个数字会增长。我不知道这是否与问题有些相关。
编辑:我修改了架构,这里是我将如何创建表:
CREATE TABLE movies (
id serial PRIMARY KEY,
title text NOT NULL,
runtime smallint NOT NULL CHECK (runtime >= 0),
released_in smallint NOT NULL CHECK (released_in > 0),
genres text[] NOT NULL default ARRAY[]::text[],
tags text[] NOT NULL default ARRAY[]::text[],
origin text[] NOT NULL …Run Code Online (Sandbox Code Playgroud) 我在使用 InnoDB 存储引擎的 MySQL 5.5 中有一个包含大约 3000 万行的表。这个表有一个外键,它链接到另一个大约有 300 万行的表。
我想向更大的表添加一个主键,但我不确定如何最好地做到这一点。没有我可以使用的现有列(或列集),那么我应该怎么做呢?
我看到了一些对内部 InnoDB 记录 ID 的引用,但还没有找到是否可以访问。
否则,也许我需要转储并重新加载数据,手动添加 id。
谢谢。
我有一个包含自动递增主键 ID 的表。如果我删除最后一行(最高 id,例如 id = 6)并插入新行,则新 id 从 7 开始。我必须更改哪个参数才能使主键从 6 开始?
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');
Run Code Online (Sandbox Code Playgroud)
结果:
id 名称
1 狗
2 猫
3 企鹅
4 松懈
5 鲸鱼
6 鸵鸟
DELETE FROM animals WHERE id = 6;
INSERT INTO animals (name) VALUES
('x');
Run Code Online (Sandbox Code Playgroud)
结果:
id 名称
1 狗
2 猫
3 企鹅
4 松懈
5 鲸鱼
7 …
我有一个不在生产中的数据库,所以主表是 CustodyDetails,这个表有一个ID int IDENTITY(1,1) PRIMARY KEY列,我正在寻找一种添加另一个唯一标识符的方法,它没有在任何其他表中引用,我认为通过将其纳入帐户列的内容不会完全是身份密钥。
不过,这个新的身份列有一些特定的细节,这就是我的问题开始的地方。格式如下:XX/YY其中XX是一个自动递增的值,它在每个新年重置/重新启动,YY是当前年份的最后 2 位数字SELECT RIGHT(YEAR(GETDATE()), 2)。
因此,例如让我们假设从28/12/2015开始到03/01/2016每天添加一条记录,该列将如下所示:
ID ID2 DATE_ADDED
1 1/15 2015-12-28
2 2/15 2015-12-29
3 3/15 2015-12-30
4 4/15 2015-12-31
5 1/16 2016-01-01
6 2/16 2016-01-02
7 3/16 2016-01-03
Run Code Online (Sandbox Code Playgroud)
我想到了用前端来解析复合ID(示例中为ID2)获取最后2位数字并与当前年份的最后2位数字进行比较,然后决定是否开始一个新的关联。当然,能够在数据库端完成这一切就太好了。
编辑 1:顺便说一句,我也看到人们使用单独的表来存储并行身份键,所以一个表身份键变成了第二个表辅助键,这听起来有点狡猾,但也许是这种实现的情况?
编辑 2:这个额外的ID 是一个旧文档引用,它标记每个文件/记录。我想人们可以将其视为主 ID 的特殊别名。
这个数据库每年处理的记录数量在过去 20 年里没有超过 100 条,而且非常(真的,非常高)不可能,当然,如果它超过 99 条,该领域将能够继续使用额外的数字,前端/过程将能够超过 99,所以它不会改变事情。
当然,其中一些细节我一开始没有提到,因为它们只会缩小解决方案的可能性以满足我的特定需求,试图使问题范围更广。
假设我有一个 1 对 N 的关系(person_id, pet_id)。我有一张表,pet_id主键在哪里。
我知道 InnoDB 二级索引本质上是一个 B 树,其中值是行的相应主键值。
现在,假设一个人可以拥有数千只宠物,而我通常希望一个人的宠物按pet_id. 那么,如果在第二个索引记录的排序会的问题(person_id, pet_id)或只是person_id用pet_id的该person_id是无序。猜到后来。
那么,如果person_id是非唯一的,记录是按物理排序(person_id, pet_id)还是仅排序pet_id?
谢谢
我有两张桌子:一张user桌子和一张friendship桌子。假设friendship表格如下所示:
friendship
------------
user_one_id
user_two_id
other_fields
Run Code Online (Sandbox Code Playgroud)
我需要强制执行和忽略ordering值组合的唯一性,因此:(user_one_id, user_two_id)
user_one_id | user_two_id
------------+------------
1 | 2
2 | 1 -- the DBMS should throw a unique constraint error when trying to insert a row like this one.
Run Code Online (Sandbox Code Playgroud)
另外重要的一点是,user_one_id代表发起的friendship,并user_two_id代表收件人,所以我不能只是做了两个“小”的ID user_one_id。
问题
有没有办法使用约束来做到这一点,还是应该以其他方式实现?
在 Postgres 12 中,我正在跟踪照片。每个都很大,每个大约 6 到 8 兆。为了快速浏览,我将与完整图像一起存储缩略图。full 和thumbnail 都是 BYTEA 类型的列。
为了性能,我想避免在只需要缩略图时加载完整图像。据我了解,访问一行时,所有 BYTEA 字段值都将加载到内存中。因此,即使在查询中没有明确请求,向用户显示缩略图列表也必然会在服务器上加载完整的照片。
因此,我将把照片表分成两部分,将缩略图存储在主表中,并将缩略图存储在单独的子表中,以一对一的方式。
在这种情况下,子全图表携带其父缩略图行的 ID 作为外键。该外键列在逻辑上也可以用作主键。
我可以指定子项的一列既是外键又是主键吗?如果是这样,是否有任何需要注意的注意事项?
从创建的角度来看,假设在 Postgres 中通过自动递增的 PK 排序将按时间顺序对记录进行排序是否安全?我有一个多对多的关系,除了关系本身和某种形式的创建顺序之外,我不需要跟踪其他任何东西。我正在尝试决定是否需要为此合并时间戳列,或者是否可以出于相同目的重新利用现有的自动递增 PK 列。
primary-key ×10
postgresql ×4
mysql ×3
innodb ×2
deadlock ×1
foreign-key ×1
logs ×1
mariadb ×1
sequence ×1
sql-server ×1
sqlite ×1
t-sql ×1
upsert ×1