gpt4 book ai didi

SQL Server 从大表中选择速度慢

转载 作者:行者123 更新时间:2023-12-02 10:34:10 25 4
gpt4 key购买 nike

我有一个包含大约 20 多万条记录的表。

结构如下:

EventId UNIQUEIDENTIFIER
SourceUserId UNIQUEIDENTIFIER
DestinationUserId UNIQUEIDENTIFIER
CreatedAt DATETIME
TypeId INT
MetaId INT

表每天接收大约 100k+ 条记录。

除了 MetaId 之外,我在每列上都有索引,因为它没有在“where”子句中使用

问题是当我想接例如。所需 SourceUserId 的最新 100 条记录

查询有时需要长达 4 分钟才能执行,这是 Not Acceptable 。

例如。

SELECT TOP 100 * FROM Events WITH (NOLOCK)
WHERE SourceUserId = '15b534b17-5a5a-415a-9fc0-7565199c3461'
AND
(
TypeId IN (2, 3, 4)
OR
(TypeId = 60 AND SrcMemberId != DstMemberId)
)
ORDER BY CreatedAt DESC

我无法进行分区等操作,因为我使用的是标准版 SQL Server,而 Enterprise 太贵了。

我还认为表太小了,所以速度这么慢。

我认为问题出在 ORDER BY 子句上,因为数据库必须处理更大的数据集。

有什么想法可以让它更快吗?

也许关系数据库对于此类数据来说不是一个好主意。

数据总是按 CreatedAt DESC 顺序获取

感谢您的阅读。

巴勃罗X

最佳答案

您可能希望为这种类型的查询创建一个复合索引 - 当查询运行缓慢时,它很可能选择向下扫描 CreatedAt 列上的索引并对 SourceUserId 值执行残差过滤器,当实际上,您想要发生的是直接跳转到正确排序的给定 SourceUserId 的所有记录 - 为了实现这一点,您需要主要在 SourceUserId 上创建一个复合索引(执行相等性检查),其次在 CreateAt 上创建一个复合索引(以保留给定 SourceUserId 值内的顺序)。您可能还想尝试添加 TypeId,具体取决于此列的选择性。

因此,最有可能提供最佳可重复性能(尝试并比较)的两个是:

  1. 索引(SourceUserId、CreatedAt)
  2. 索引(SourceUserId、TypeId、CreatedAt)

与往常一样,在确定索引方式/内容/位置时还需要考虑许多其他因素,正如 Remus 在单独的答案中讨论的那样,一个重要的考虑因素是覆盖查询与保留查找。此外,您还需要考虑写入量,possible fragmentation impact (if any) 、单例查找与大型顺序扫描等。

关于SQL Server 从大表中选择速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1835230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com