2010-06-21 110 views
0

我注意到,在大型表上使用LIKE的第一个sql语句运行非常缓慢(大约20分钟),但每个后续的一个非常非常快(几秒钟),即使是 如果字符串搜索完全不同于最初的 (第一个字符串'能力%',第二个'su_mit%')sql server 2008 LIKE性能

sql服务器是否将“like语句”的表扫描结果存储在缓存中? 所有客户端都可以访问可能的缓存吗?
“缓存”是否过期?
如果全文索引可用于应用和填充LIKE的同一列,“缓存”是否会影响全文速度?
有没有人知道解释问题的文档?
干杯
格雷格

回答

1

什么您遇到最有可能的表在buffer cache(高速缓存内存中的数据页)第一次扫描后,为部分(或全部)的结果。根据您使用扫描,可用内存和其他正在缓存的表访问同一个表的频率,SQL Server可能会将您的表的页保留在缓冲区缓存中,或者可能会因其他人的利益而将其撞上。

对于没有领先的通配符查询(如上面你的例子),如果要查询的列都与一个普通索引收录,你可以将其降低到索引扫描...

全文索引LIKE操作符没有使用,如果列上有全文索引,那么从LIKE查询更改为全文查询可能是一个好主意...请参阅http://msdn.microsoft.com/en-us/library/ms142559.aspx

+0

索引是不幸的不是一个选项 - 字符串可以在任何地方的字段和大小太大,无法索引.. 如果它是在内存中的页面,所以我想它是不可靠的性能 - 他们可能会出去内存在任何时候... – Greg 2010-06-21 11:16:46

+0

好吧,听起来像全文索引将是你最好的选择... ...是的,缓冲区缓存中的页面可以在任何时候被其他查询碰到(除非你有足够的空间RAM以适应内存中的整个数据库:))。 – KristoferA 2010-06-21 12:12:29

0

SQL Server基本上像虚拟内存系统,所以当你进行第二次表扫描时,你看到的性能提升只是更多的页面在内存中。

我不是SQL服务器专家,所以也许别人可以为此添加更多细节,但是当您使用LIKE时,基本上是删除数据库使用任何索引的能力。如果要使用全文索引,则需要使用特定的全文索引查询命令FREETEXT,FREETEXTTABLE,CONTAINS和CONTAINSTABLE之一。