加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 添加通配符(或顶部)时SQL Server查询的大幅减速

发布时间:2020-12-30 14:02:19 所属栏目:MsSql教程 来源:网络整理
导读:我有一个拥有2000万只动物的动物园,我在我的SQL Server 2005数据库上进行跟踪.其中约1%是黑色的,其中约1%是天鹅.我想得到所有黑天鹅的细节,所以,不想淹没我做的结果页面: select top 10 * from animal where colour like 'black' and species like 'swan'

在2008年有一个documented trace flag 4138关闭了行目标.这样做的结果是计划的成本是在没有假设TOP允许子运算符提前终止而不读取所有匹配行的情况下计算的.有了这个跟踪标志,我自然会得到更优的索引交叉计划.

SELECT TOP 10 *
FROM   animal
WHERE  colour LIKE 'black%'
       AND species LIKE 'swan'
OPTION (QUERYTRACEON 4138)

这个计划现在正确地用于读取两个索引搜索中的全部20万行但是超过成本的关键查找成本(估计为2千对比实际值为0. TOP 10会将此约束为最大值10但是跟踪标记可防止将其用于帐户).该计划的成本仍然比完整的CI扫描便宜得多,因此被选中.

当然,这个计划对于常见的组合可能不是最佳的.如白天鹅.

动物(颜色,物种)或理想动物(物种,颜色)的综合指数将使查询对两种情景都更有效.

为了最有效地利用复合索引,LIKE’swan’也需要改为=’swan’.

下表显示了所有四种排列的执行计划中显示的搜索谓词和残差谓词.

+----------------------------------------------+-------------------+----------------------------------------------------------------+----------------------------------------------+
|                 WHERE clause                 |       Index       |                         Seek Predicate                         |              Residual Predicate              |
+----------------------------------------------+-------------------+----------------------------------------------------------------+----------------------------------------------+
| colour LIKE 'black%' AND species LIKE 'swan' | ix_colour_species | colour >= 'black' AND colour < 'blacL'                         | colour like 'black%' AND species like 'swan' |
| colour LIKE 'black%' AND species LIKE 'swan' | ix_species_colour | species >= 'swan' AND species <= 'swan'                        | colour like 'black%' AND species like 'swan' |
| colour LIKE 'black%' AND species = 'swan'    | ix_colour_species | (colour,species) >= ('black','swan')) AND colour < 'blacL'    | colour LIKE 'black%' AND species = 'swan'    |
| colour LIKE 'black%' AND species = 'swan'    | ix_species_colour | species = 'swan' AND (colour >= 'black' and colour <  'blacL') | colour like 'black%'                         |
+----------------------------------------------+-------------------+----------------------------------------------------------------+----------------------------------------------+

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读