【发布时间】:2011-05-17 11:05:42
【问题描述】:
我继承了一个新系统,我正在尝试对数据进行一些改进。我正在尝试改进这张表,但似乎无法理解我的发现。
我的表结构如下:
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 年 12 月 1 日。此查询将返回大约 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'
【问题讨论】:
-
请问您正在运行的确切查询是什么?
-
是的,很抱歉。让我编辑和添加。我忘了包括。
-
什么是 TicketRecvdDateTime?那是某处的计算列吗?或者为什么不在您的表格声明中?
-
抱歉,查询来自我尝试使用日期列而不是日期字段的 varchar 创建的新表。让我修复原始用途的查询。
标签: sql tsql sql-server-2008 query-performance