一尘不染

加快SQL的提示和技巧

sql

这个问题已经在这里有了答案

9年前关闭。

可能重复:
WHERE子句中的列顺序重要吗?

这些是基本SQL功能和关键字。

有什么提示或技巧可以加快您的速度SQL吗?

例如; 我有很多关键字的查询。(AND, GROUP BY, ORDER BY, IN, BETWEEN, LIKE…等)

哪个关键字应该在我的查询中排在最前面?我该如何决定?

例子;

Where NUMBER IN (156, 646)
AND DATE BETWEEN '01/01/2011' AND '01/02/2011'

或者

Where DATE BETWEEN '01/01/2011' AND '01/02/2011'
AND NUMBER IN (156, 646)

哪一个更快?取决于什么?


阅读 125

收藏
2021-03-10

共1个答案

一尘不染

没有“技巧”。

鉴于数据库供应商之间的竞争是“更快”的,任何永远正确的“技巧”都将在数据库本身中实现。(这些技巧在数据库的“优化程序”部分中实现)。

只有要注意的事情,但通常不能简化为:

  • 使用功能 X
  • 避免特征 Y
  • 这样的* 模型 *
  • 永远不要像 那样* 建模 *

查看有关索引,索引类型,索引策略,群集,单列键,复合键,参照完整性,访问路径,联接,联接机制,存储引擎,优化器行为,数据类型,规范化,查询转换,反规范化,过程,缓冲区高速缓存,结果集高速缓存,应用程序高速缓存,建模,聚合,函数,视图,索引视图,集合处理,过程处理,并且列表继续存在。

所有这些都是为了攻击特定的问题区域而发明的。在该问题上的变化使“技巧”或多或少地适合。很多时候,这些技巧的效果为零,有时甚至变得可怕。为什么?因为当我们不了解某些事情为什么起作用时,我们基本上只是在向问题扔出一些功能,直到问题消失为止。

这里的关键点在于, 有一个原因使某事物使查询运行得更快 ,并且对事物的含义的 理解 对于
理解为什么一个不同的无关查询缓慢并对其进行处理的过程 至关重要 。这绝不是招数,也不是魔术。

我们(人类)很懒惰,当我们真正需要的是学习如何捕捉时,我们希望把那条鱼扔掉。

现在,您想抓什么具体的鱼?

编辑注释:
谓词在where子句中的放置没有区别,因为谓词的处理顺序由数据库确定。一些会影响该顺序的因素(例如,您的例子)是:

  • 是否可以针对索引视图重写查询
  • 有哪些可用的索引涵盖NUMBER和DATE列中的一者或两者,以及它们在该索引中的排列顺序
  • 谓词的估计选择性,基本上是指谓词匹配的行的估计百分比。百分比越低,优化器就越有可能有效地使用索引。
  • 如果SQL Server将群集因素(或SQL Server中的任何名称)作为查询成本的因素,则为群集因素。这与索引条目的顺序与表行的物理顺序如何对齐有关。更好的对齐方式=降低了通过该索引获取的更高百分比的行的成本。

现在,如果您在NUMBER列中仅有的值是156、646,并且它们几乎均匀分布,则索引将无用。全面扫描将是更好的选择。
另一方面,如果这些是唯一的订单号(由唯一索引支持),则优化器将选择该索引并从那里驱动查询。同样,如果在2011年1月1日到1月2日之间具有DATE的行占行的比例很小,则将考虑以DATE开头的索引。

或者,如果您order by NUMBER, DATE在方程式中包含另一个参数;分拣成本。现在,(NUMBER,DATE)上的索引似乎对优化器更具吸引力,因为即使它不是获取行的最有效方法,也可以跳过排序(这很昂贵)。

或者,如果您的查询包括对customer_id上的另一个表(例如customer)的联接,并且您还对进行了过滤customer.ssn,则方程式也会再次更改,因为(由于您对外键和后备索引所做的出色工作)您现在将拥有到第一个表的非常有效的访问路径,而无需使用NUMBER或DATE中的索引。除非您只有一个客户,并且他的1000万个订单中的所有客户都…

2021-03-10