首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类似查询优化

类似查询优化
EN

Database Administration用户
提问于 2018-04-12 12:31:11
回答 5查看 8.6K关注 0票数 2

下表如下:

代码语言:javascript
运行
复制
create table Order_Details
(
 ID int not null primary key
,Order_ID int
,Order_Description nvarchar(40)
)

我们在上面的表中插入了27,500,000行,当我在查询下面运行时,需要6-7秒。

代码语言:javascript
运行
复制
select ID,Order_ID, Order_Description 
from Order_Details
where Order_Description  like '%Football Size%'

我在Order_Description上应用了一个非聚集索引,包括IDOrder_ID

还有其他方法来优化查询并以更快的方式获得结果吗?

EN

回答 5

Database Administration用户

回答已采纳

发布于 2018-04-12 13:14:28

如果不更改结构,就无法优化查询,这样的LIKE过滤器总是会导致索引或表扫描。

Order_Description相比,索引可能会得到很小的改进,尽管这只是一个很小的差别。

您最好为order details设计一个合适的模式,这样您就可以高效地按行项属性进行搜索,而不是将其存储在单个字符串字段中。如果你在你的问题上加上你希望在那一栏中找到的数据类型,我们可能会在那里帮助你更多的细节。

另一个需要研究的选项是在大多数Server版本中可用的全文,但我怀疑这不是最佳的解决方案。

票数 3
EN

Database Administration用户

发布于 2018-04-12 13:10:04

问题是双通配符'%string searches%'Server中的慢速,因为我们本机没有高级的三联图搜索。

即使在字符串搜索列上有一个索引,我们也必须读取每一行。

代码语言:javascript
运行
复制
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%'

如果您只搜索一个字符串(这从来不是这样),或者您有一组有限的已知搜索字符串,那么索引的计算列(或多个列)可能对您有好处。

代码语言:javascript
运行
复制
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上搜索的顺序来跟踪每一项。

票数 6
EN

Database Administration用户

发布于 2018-04-13 06:29:59

我对Server没有经验,但是我会将一个索尔放在我的DB旁边,让它处理文本搜索,返回order_id和order_details.id,然后您可以使用它们在DB中进行进一步的查询。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/203748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档