gpt4 book ai didi

sql - 为什么这个查询在没有索引的情况下更快?

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

我继承了一个新系统,我正在尝试对数据进行一些改进。我正在尝试改进此表,但似乎无法理解我的发现。

我有以下表结构:

CREATE TABLE [dbo].[Calls](
[CallID] [varchar](8) NOT NULL PRIMARY KEY,
[RecvdDate] [varchar](10) NOT NULL,
[yr] [int] NOT NULL,
[Mnth] [int] NOT NULL,
[CallStatus] [varchar](50) NOT NULL,
[Category] [varchar](100) NOT NULL,
[QCall] [varchar](15) NOT NULL,
[KOUNT] [int] NOT NULL)

该表中有大约 220k 条记录。我需要返回日期大于特定日期的所有记录。在这种情况下,2009 年 1 月 12 日。此查询将返回大约 66k 条记录,运行大约需要 4 秒。从过去的系统来看,我在这方面的工作似乎很高。特别是考虑到表中的记录很少。所以我想缩短这段时间。

所以我想知道有什么好方法可以降低这种情况?我尝试向表中添加日期列并将字符串日期转换为实际日期列。然后我在该日期列上添加了一个索引,但时间保持不变。鉴于没有那么多记录,我可以看到表扫描的速度如何,但我认为索引可以缩短时间。

我还考虑过只查询月份和年份列。但我还没有尝试过。并希望尽可能将其保留在日期列之外。但如果没有,我可以改变它。

任何帮助表示赞赏。

编辑:这是我尝试运行并测试表速度的查询。我通常会列出列,但为了简单起见,我使用了 * :
SELECT *
FROM _FirstSlaLevel_Tickets_New
WHERE TicketRecvdDateTime >= '12/01/2009'

编辑 2:所以我提到我曾尝试创建一个包含日期列的表,该列包含 recvddate 数据但作为日期而不是 varchar。这就是上面查询中的 TicketRecvdDateTime 列。我对该表运行的原始查询是:
SELECT *
FROM Calls
WHERE CAST(RecvdDate AS DATE) >= '12/01/2009'

最佳答案

您可能会遇到 SQL Server 中所谓的临界点。即使您在列上有适当的索引,如果返回的预期行数超过某个阈值(“临界点”),SQL Server 仍可能决定执行表扫描。

在您的示例中,这似乎是可能的,因为您正在将数据库中的行数变为 1/4。以下是解释这一点的好文章:http://www.sqlskills.com/BLOGS/KIMBERLY/category/The-Tipping-Point.aspx

关于sql - 为什么这个查询在没有索引的情况下更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4307046/

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