下表如下:
create table Order_Details
(
ID int not null primary key
,Order_ID int
,Order_Description nvarchar(40)
)
我们在上面的表中插入了27,500,000行,当我在查询下面运行时,需要6-7秒。
select ID,Order_ID, Order_Description
from Order_Details
where Order_Description like '%Football Size%'
我在Order_Description
上应用了一个非聚集索引,包括ID
和Order_ID
。
还有其他方法来优化查询并以更快的方式获得结果吗?
发布于 2018-04-12 13:14:28
如果不更改结构,就无法优化查询,这样的LIKE
过滤器总是会导致索引或表扫描。
与Order_Description
相比,索引可能会得到很小的改进,尽管这只是一个很小的差别。
您最好为order details设计一个合适的模式,这样您就可以高效地按行项属性进行搜索,而不是将其存储在单个字符串字段中。如果你在你的问题上加上你希望在那一栏中找到的数据类型,我们可能会在那里帮助你更多的细节。
另一个需要研究的选项是在大多数Server版本中可用的全文,但我怀疑这不是最佳的解决方案。
发布于 2018-04-12 13:10:04
问题是双通配符'%string searches%'
是Server中的慢速,因为我们本机没有高级的三联图搜索。
即使在字符串搜索列上有一个索引,我们也必须读取每一行。
CREATE NONCLUSTERED INDEX ix_displayname ON dbo.Users(DisplayName)
SELECT u.Id, u.Reputation, u.DisplayName
FROM dbo.Users AS u
WHERE u.DisplayName LIKE '%Christopher%'
如果您只搜索一个字符串(这从来不是这样),或者您有一组有限的已知搜索字符串,那么索引的计算列(或多个列)可能对您有好处。
ALTER TABLE dbo.Users ADD SearchString
AS CONVERT(BIT, CASE WHEN DisplayName LIKE '%Christopher%' THEN 1 ELSE 0 END)
CREATE INDEX ix_yourmom ON dbo.Users (SearchString)
否则,您将不得不想出一种更好的方法来定位不需要搜索文本的数据,比如一个OrderLines
表,它按照可以在ID上搜索的顺序来跟踪每一项。
发布于 2018-04-13 06:29:59
我对Server没有经验,但是我会将一个索尔放在我的DB旁边,让它处理文本搜索,返回order_id和order_details.id,然后您可以使用它们在DB中进行进一步的查询。
https://dba.stackexchange.com/questions/203748
复制相似问题