【发布时间】:2019-11-20 10:12:08
【问题描述】:
我有两张桌子
Session
- Id
- UserId
- CodeId (foreign key to Code.Id)
和
Code
- Id
- Text (string of 50 - 100 characters)
当然我可以做到以下几点:
- 尝试从代码中获取 ID
- 如果返回空,则插入新行并获取 ID
- 插入会话
你会得到类似这样的东西:
DECLARE @codeId INT;
SET @codeId = (SELECT Id FROM Code WHERE [Text] = @code);
IF ( @codeId IS NULL )
BEGIN
INSERT INTO Code ([Text]) VALUES (@code)
SET @codeId = SCOPE_IDENTITY()
END
INSERT INTO Session (UserId, codeId) VALUES(@userId, @codeId)
- 是否也可以通过更高效的调用来做到这一点?
- 我应该关注比赛条件吗?
免责声明: 在拥有大量用户的生产站点上,这将被称为很多,并且在这种环境中已经证明性能很重要。
补充说明
-
Code.Text上会有一个唯一索引 - 我预计
Session中有数百万行 - 我预计
Code中大约有 50.000 到 200.000 行
【问题讨论】:
-
您希望代码中大约有多少行?你会有文本索引吗?该索引可以是唯一的吗?
-
我建议将
nolock添加到您的选择(SELECT Id FROM Code WITH(NOLOCK) WHERE [Text] = @code); -
嗨@SerkanArslan,感谢您的留言-您能详细说明原因吗?
-
@DirkBoer 如果代码表由于插入而有任何锁定,它会阻止等待选择。由于潜在的会话数,它看起来是可能的。
标签: sql sql-server foreign-keys sql-insert