加速SQL的提示和技巧

时间:2011-03-28 08:40:31

标签: sql database tsql

  

可能重复:
  Does the order of columns in a WHERE clause matter?

这些是基础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'

OR

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

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

4 个答案:

答案 0 :(得分:5)

不要在where子句中使用函数。因为查询引擎必须为每一行执行函数。

答案 1 :(得分:4)

没有“技巧”。

鉴于数据库供应商之间关于哪一个“更快”的竞争,任何总是正确的“技巧”都将在数据库本身中实现。 (这些技巧在数据库中称为“优化器”的部分实现。)

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

  • 使用功能 X
  • 避免使用 Y
  • 功能
  • 模仿 this
  • 永远不要像那样

查看关于索引,索引类型,索引策略,集群,单列密钥,复合键,参照完整性,访问路径,连接,连接机制,存储引擎,优化器行为,数据类型,规范化,所有肆虐的问题/讨论查询转换,非规范化,过程,缓冲区缓存,结果集缓存,应用程序缓存,建模,聚合,函数,视图,索引视图,集合处理,程序处理和列表继续。

所有这些都是为了攻击特定问题而发明的。这个问题的变化使“技巧”或多或少变得合适。通常这些技巧都没有效果,有时甚至会变得非常糟糕。为什么?因为当我们不理解为什么某些东西有效时,我们基本上只是在问题上抛出特征直到它消失。

这里的关键点在于有什么原因可以让查询更快理解的内容是至关重要< / strong>了解为什么不同的不相关查询很慢,以及如何处理它的过程。它绝不是一招,也不是魔术。

我们(人类)是懒惰的,当我们真正需要的是学习如何抓住它时,我们想要抛弃鱼。

现在,您想要捕获哪些特定的鱼?

编辑评论:
谓词在where子句中的放置没有区别,因为它们的处理顺序由数据库决定。一些会影响该订单的事情(例如):

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

现在,如果您在NUMBER列中拥有的唯一值是156,646并且它们几乎均匀分布,则索引将毫无用处。全扫描将是更好的选择 另一方面,如果这些是唯一的订单号(由唯一索引支持),优化器将选择该索引并从那里驱动查询。类似地,如果具有介于2011年1月1日和2日之间的DATE的行构成足够小的行数,则将考虑使用DATE的索引。

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

或者,如果您的查询在customer_id上包含了对另一个表(比如客户)的加入,并且您在customer.ssn上也有一个过滤器,那么等式也会更改,因为(因为您使用外键和现在,您将拥有一个非常有效的访问第一个表的访问路径,而不使用NUMBER或DATE中的索引。除非你只有一个客户,而且所有1000万个订单都在他的......

答案 2 :(得分:3)

阅读sargable查询(可以使用索引副查询但不能查询的查询)。避免相关子查询,where子句,游标和while循环中的函数。不要使用select *,特别是如果你有连接,永远不会返回超过你需要的数据。

实际上,有一些关于性能调优的书籍,为了你正在使用的数据库而获得一本并阅读它,因为技术因数据库而异。

答案 3 :(得分:2)

学会正确使用索引。

http://Use-The-Index-Luke.com/