假设我有一个包含 200000 条记录的 Person 表,它的 GUID 主键上有一个聚集索引。此 GUID 是使用 SQL Server (2008 R2) 提供的 NEWSEQUENTIALID() 构造生成的。此外,LastName (varchar(256)) 列上有一个常规索引。
对于每条记录,我生成了一个唯一的名称(Lastname_1 到 Lastname_200000),现在我正在处理一些查询,并且发现我的条件越严格,SQL Server 返回实际结果的速度就越慢。而且这种性能影响是相当严重的。
例如:
SELECT * FROM Person WHERE Lastname LIKE '%Lastname_123456%'
比慢得多
SELECT * FROM Person WHERE Lastname LIKE '%Lastname_123%'
响应时间是通过设置以下统计信息来衡量的:
SET STATISTICS TIME ON
我可以想象这是造成的
1)由于 LIKE 子句本身,由于它以 % 开头,因此无法在该特定列上使用 inde,
2) SQL 不得不更多地考虑我的“更大的问题”。
这有什么道理吗?有什么办法可以避免这种情况吗?
编辑:要为这个问题添加一些上下文,这是“免费搜索”用例的一部分。当用户输入完整的姓氏时,我非常希望系统能够快速运行。
我应该如何使这些案例执行?我应该避免 '%xxx%' 构造而去 'xxx%' 之类的构造吗?这确实增加了很多速度,但代价是用户的一些灵活性......