好吧,在我开始之前我想说,我对这个Sql索引事情完全不熟悉.
我有一张桌子没有加入任何东西.它包含以下列:
Id (int)
String1 (nvarchar(10)
String2 (nvarchar(50)
DateTime1 (date)
DateTime2 (date)
DateTime3 (date)
我在那张桌子上有大约100,000,000行.并且对它进行搜索非常慢,所以我想我必须添加一些索引.
我只会运行以下查询:
查询1
select * from Table
where String1 = "Blah" and
String 2 = "Blah" and
DateTime1 <= {someTime1} and
DateTime2 >= {someTime1}
查询2
select * from Table
where String1 = "Blah" and
String 2 = "Blah" and
DateTime2 >= {someTime1}
查询3
select * from Table
where String1 = "Blah" and
String 2 = "Blah" and
DateTime3 >= {someTime1}
请注意,它们几乎是相同的查询,除了它们的日期比较略有不同.此外,排序不是问题.
所以我尝试在列String1,String2,DateTime1,DateTime2上添加非聚集索引.在这里运行查询1是我看到的:
>现在速度要快得多,但加载时仍需要大约20秒.
>我注意到对于完全相同的查询(具有相同的搜索参数),如果我再次调用它,它将在不到一秒的时间内返回数据.
>我注意到如果我使用其他一些参数运行查询1,它将再次需要20秒才能加载.
>我注意到我的RAM在查询后上升并保持不变.
所以这是我的问题:
>我这样做对吗?为什么加载需要20秒?添加索引后不应该很快吗?
>什么是Sql server对我的RAM做什么?我需要更多内存,因为我有一张大桌子吗?
>我是否需要为查询2和查询3添加新索引?或者我添加的索引已经足够其他2个查询?
谢谢,
驰
最佳答案 >解析和编译查询,也许从磁盘读取.这就是它第二次快速运行的原因.当参数改变时,需要时间再次编译.
>数据缓存.又名缓冲池.一般来说,SQL Server不会出现更多内存.
>查询1和2相同,查询3不同.
我会建议2个索引开始
> String1,String 2,DateTime2,DateTime1 INCLUDE DateTime3
> String1,String 2,DateTime3 INCLUDE DateTime2,DateTime1
关于数据类型的其他想法……如果路线越小越好
>你需要nvarchar吗? Will varchar be OK?
> ditto datetime vs smalldatetime或(如果是SQL Server 2008)datetime2
编辑:
磁盘读取将在内存中发生(简单地),因此更多RAM将有所帮助
但是,我怀疑20个secodns是编译统计信息等,而不是从磁盘读取