我想使用 GUID,因为它们是可移植的,并且可以更轻松地使用多个数据库。但是由于存在性能问题,这可能不是一个好主意?虽然我发现了一个 MS 博客条目,其中另有说明:http : //blogs.msdn.com/b/cbiyikoglu/archive/2012/05/17/id-generation-in-federations-identity-sequences-and-guids -唯一标识符.aspx
我已经阅读了一种替代方法,其中 datetime2 列用作聚集索引,Guid 用作 PK。因为我的大多数表格都有一个CreatedAtUtc
列,这对我来说应该是一个可行的选择。但这真的有用吗?
所以我的问题是我是否应该使用 GUID 来获得可移植性,或者是否有更好的解决方案?
(使用 GUID,我还可以在我的代码中创建 Id 并在提交之前做更多的事情)。我还创建了一个 COMB 生成器,它应该比常规 GUID 更适合 MSSQL。
我得到了一个合理的简单查询:
With RowsToDelete AS
(
SELECT TOP 500 Id
FROM ErrorReports
WHERE IncidentId = 611
)
DELETE FROM RowsToDelete
Run Code Online (Sandbox Code Playgroud)
但是,它没有完成。我已经尝试了几次。上次我等了 8 分钟才取消。
ErrorReports
包含大约 22 000 行。ErrorReportOrigins
差不多。
预计执行计划:
实际执行计划(对于top 10
,需要 28 秒才能完成):
执行计划:https : //www.brentozar.com/pastetheplan/?id=S1jUXDruz
客户统计:
我试过的:
ErrorReportOrigins
没有聚集索引 (id),只有一个 FK 到ErrorReports.Id
. 我添加了一个 id 列(pk&identity)。ErrorReportOrigins
第一个删除(使用相同的 CTE)。没有不同ORDER BY Id
,我把它去掉看看有没有区别)我迷路了。为什么要花这么长时间?所有 SELECT 语句都很快。而且数据库并不是很大。该ErrorReports
表是最大的一个。
(这是一个弹性池中的 SQL Azure DB)
更新
CREATE TABLE [dbo].[ErrorReports](
[Id] [int] IDENTITY(1,1) …
Run Code Online (Sandbox Code Playgroud) 我当前的客户端需要能够查看 SQL Server Service Broker 队列中的消息。当前的实现使用 RECEIVE 和 rollback 来窥视。
由于这会生成对事务日志的写入,我想知道 SELECT TOP(1) 是否会返回与 RECEIVE 命令相同的行?
该队列有多个作者,但只有一个读者。