小编jga*_*fin的帖子

在 Azure 中使用 GUID 作为主键?

我想使用 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。

sql-server azure-sql-database

6
推荐指数
1
解决办法
6600
查看次数

删除查询需要永远

我得到了一个合理的简单查询:

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)。
  • 我已经重建了所有索引(使用this)。
  • 尝试从ErrorReportOrigins第一个删除(使用相同的 CTE)。没有不同
  • (原来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 delete azure-sql-database

3
推荐指数
1
解决办法
9145
查看次数

SELECT(不带 ORDER BY)是否返回与 RECEIVE 相同的消息?

我当前的客户端需要能够查看 SQL Server Service Broker 队列中的消息。当前的实现使用 RECEIVE 和 rollback 来窥视。

由于这会生成对事务日志的写入,我想知道 SELECT TOP(1) 是否会返回与 RECEIVE 命令相同的行?

该队列有多个作者,但只有一个读者。

sql-server service-broker

1
推荐指数
1
解决办法
311
查看次数