spi*_*non 5 sql t-sql sql-server-2008 query-performance
我继承了一个新系统,我试图对数据进行一些改进.我正在努力改进这个表,似乎无法理解我的发现.
我有以下表结构:
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)
Run Code Online (Sandbox Code Playgroud)
该表中有大约220k的记录.我需要返回日期大于特定日期的所有记录.在这种情况下12/1/2009.此查询将返回大约66k记录,运行大约需要4秒.从我过去的系统来看,这似乎很高.特别是考虑到表中的记录很少.所以我想把时间缩短.
所以我想知道什么是一些好的方法来降低它?我尝试在表中添加日期列并将字符串日期转换为实际日期列.然后我在该日期列添加了索引,但时间保持不变.鉴于没有那么多记录,我可以看到表扫描如何快速但我认为索引可以减少时间.
我还考虑过查询月份和年份列.但我还没有尝试过.如果可能的话,我希望将其保留在日期栏之外.但如果不是,我可以改变它.
任何帮助表示赞赏.
编辑:这是我试图运行的测试并测试表的速度.我通常把列放出来,但为了简单起见,我使用了*:
SELECT *
FROM _FirstSlaLevel_Tickets_New
WHERE TicketRecvdDateTime >= '12/01/2009'
Run Code Online (Sandbox Code Playgroud)
编辑2:所以我提到我曾尝试使用包含recvddate数据的日期列创建一个表,但是作为日期而不是varchar.这就是TicketRecvdDateTime列在上面的查询中.我对这个表运行的原始查询是:
SELECT *
FROM Calls
WHERE CAST(RecvdDate AS DATE) >= '12/01/2009'
Run Code Online (Sandbox Code Playgroud)
您可能会遇到 SQL Server 中所谓的临界点。即使您在列上有适当的索引,如果返回的预期行数超过某个阈值(“临界点”),SQL Server 仍可能决定执行表扫描。
在您的示例中,这似乎很可能,因为您正在转动数据库中行数的 1/4。以下是一篇很好的文章,解释了这一点:http://www.sqlskills.com/BLOGS/KIMBERLY/category/The-Tipping-Point.aspx
| 归档时间: |
|
| 查看次数: |
4091 次 |
| 最近记录: |