小编Ale*_*kiy的帖子

基于时间戳的索引

我有一个包含一些日志信息的大数据库(200GB+)。我想加快SELECT查询和存储过程。我有一个带有GeneratedOnUtc 日期时间列的表,并且上面有一个非聚集索引。

我正在考虑将其更改为聚集索引。

的原因:

  • 大量数据(约 4000 万行)

  • Column 用于多个Where子句 ( between, >, <)

  • 列用于ROW_NUMBER() OVER (ORDER BY d.GeneratedOnUtc asc) AS Row查询

反对理由:

  • 大量插入(每天约 60k)可能会导致频繁的 B 树重建。

performance index sql-server clustered-index

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

如何在没有提示的情况下强制合并连接

前段时间我使用了查询提示,但后来意识到大多数时候 SQL Server 比我更聪明。 构建额外的索引/重新组织数据或查询并获得比强制服务器使用计划要好得多的结果这通常效率低下,但对于某些数据子集来说速度足够快。但现在我处于一种我不知道如何更好地组织数据的情况。

我有两张桌子。第一个表 T1 是 (Id, CustomerId),第二个表 T2 具有相同的列。我想在 CustomerId 上加入 T1 到 T2。并获得前 N 行。在这种情况下,优化器看到我只需要 N 个 top 并说,“嘿,我将使用循环并很快找到 N 个匹配项,尤其是当我使用索引查找时。” 但它不起作用,因为没有满足条件的数据。因此它使用 aloop join来连接一个 25m 的表和一个非常慢的 100k 表。

在此处输入图片说明

当我强制 SQL Server 使用合并联接时,我得到以下计划,该计划在一秒钟内执行:

在此处输入图片说明

我不想强迫它有两个原因:

  • 首先,正如我之前所说,SQL Server 足够智能。
  • 其次,我使用的是 ORM,并且很难在生成的查询中注入提示,所以我想避免它。

在这种情况下我该怎么办?

join sql-server optimization t-sql execution-plan

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