加速SQL的技巧和窍门

加速SQL的技巧和窍门,sql,database,tsql,Sql,Database,Tsql,可能重复: 这些是基本的SQL函数和关键字 有什么技巧或技巧可以加快SQL的速度吗 比如,;我有一个有很多关键字的查询。还有,分组,排序,中间,中间,像。。。等等 在我的查询中,哪个关键字应该位于顶部? 我怎么决定呢 榜样 Where NUMBER IN (156, 646) AND DATE BETWEEN '01/01/2011' AND '01/02/2011' 或 哪一个更快?取决于什么?不要在where子句中使用函数。因为查询引擎必须为每一行执行该函数。学习正确使用索引 阅读sar

可能重复:

这些是基本的SQL函数和关键字

有什么技巧或技巧可以加快SQL的速度吗

比如,;我有一个有很多关键字的查询。还有,分组,排序,中间,中间,像。。。等等

在我的查询中,哪个关键字应该位于顶部? 我怎么决定呢

榜样

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


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

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

学习正确使用索引


阅读sargable查询,可以使用索引的查询,不能使用索引的查询。避免相关子查询、where子句中的函数、游标和while循环。不要使用select*,尤其是在有连接的情况下,不要返回超过所需数据的数据

实际上,有很多关于性能调优的书籍,你可以拿一本来看看你所使用的数据库,因为不同数据库的技术不同。

没有技巧

考虑到数据库供应商之间关于哪个更快的竞争,任何始终正确的技巧都将在数据库本身中实现。这些技巧是在名为optimizer的数据库部分实现的

只有一些事情需要注意,但通常不能归结为:

使用功能X 避免特征Y 像这样的模型 永远不要那样做模特 查看所有关于索引、索引类型、索引策略、群集、单列键、复合键、引用完整性、访问路径、连接、连接机制、存储引擎、优化器行为、数据类型、规范化、查询转换、非规范化、过程、缓冲区缓存、结果集缓存、,应用程序缓存、建模、聚合、函数、视图、索引视图、集合处理、过程处理等等

所有这些都是为了解决特定的问题而发明的。在这个问题上的变化使这个技巧或多或少地适用。很多时候,这些把戏没有任何效果,有时甚至会非常可怕。为什么?因为当我们不明白为什么某些东西会起作用时,我们基本上只是在问题上扔掉一些特性,直到它消失

这里的关键点是,有一个原因可以解释为什么某个东西会使查询更快,而理解该东西是什么对于理解不同的不相关查询为什么慢以及如何处理它的过程至关重要。而且这从来不是一个把戏,也不是魔术

我们人类是懒惰的,当我们真正需要的是学会如何捕捉鱼的时候,我们想被扔到海里

现在,你想钓什么样的鱼

编辑评论: 谓词在where子句中的位置没有区别,因为它们的处理顺序由数据库决定。在您的示例中,一些会影响该顺序的因素包括:

是否可以针对索引视图重写查询 哪些索引可以覆盖一列或两列NUMBER和DATE,以及它们在该索引中的存在顺序 谓词的估计选择性,基本上是指谓词匹配行的估计百分比。百分比越低,优化器就越有可能有效地使用索引。 集群因素或SQL Server中的任何名称(如果SQL Server将其计入查询成本)。这与索引项的顺序如何与表行的物理顺序保持一致有关。更好的对齐=降低通过该索引获取的更高百分比行的成本。 现在,如果列NUMBER中仅有的值是156646,并且它们的分布非常均匀,那么索引将是无用的。完整扫描是更好的选择。 另一方面,如果这些是由唯一索引支持的唯一订单号,优化器将选择该索引并从中驱动查询。类似地,如果日期介于2011年1月1日和2日之间的行占行数的比例足够小,则将考虑以日期开头的索引

或者,如果您包括order by NUMBER,则另一个参数进入公式的日期;分类的费用。对于优化器来说,数字、日期的索引现在似乎更具吸引力,因为即使它可能不是获取行的最有效的方法,但是可以跳过昂贵的排序


或者,如果您的查询包含到另一个表的联接(例如customer_id上的customer,并且customer.ssn上也有一个过滤器),那么等式也会发生变化,因为由于您在外键和备份索引方面做得很好,您现在可以非常高效地访问第一个表,而无需使用数字或日期索引。除非您只有一个客户,并且他的1000万订单中的所有订单都…

不使用连接来反规范化数据,否则请使用索引;。SQL优化器将为两个用户生成相同的计划
示例查询。这不是你需要担心的。@Bugai13为什么索引更好?你能解释一下吗?注意:为什么这个帖子应该关闭?我不明白。@Soner:我的意思是不要使用连接和索引,但索引并不比连接好。也不认为关闭post的原因。并非所有的更新都是从应用程序异步进行的。相信我,当客户更改姓名时,用户会注意到,一笔交易需要更新1000万条记录。这很好。谢谢@Soner Gönül-我没有得到投票吗:-我认为我的_primary_key=我的_neural_network_函数'a'、'b'、'c'没有问题,事实上它必须运行我的_neural_network_函数'a'、'b',每次使用“c”都会停止查询optimised@Ronnis您是否使用my_primary_key=my_neural_network_函数“a”、“b”、“c”来评估您的查询?查询需要很长时间吗?谢谢!你使用索引还是不使用索引?在while循环中使用游标有什么不对?您应该使用索引,但需要小心它们它们会加快选择速度,减慢插入/更新/删除速度,因此您只需要实际需要的游标,而while循环会逐行运行,速度非常慢。我已经修复了需要45分钟才能插入记录的游标,并将其替换为需要几秒钟的正确的基于集合的代码,还修复了需要24小时到不到一小时的循环过程。游标和循环是最后的手段,而不是你选择的第一个。很好的一个。据我所知,我应该在selectpart中使用索引,但不应该与insert/update/delete一起使用。顺便说一下,SQL是从右上到右下工作的?所以,若我在WHERE子句中的条件较少,这个子句应该是WHERE子句的顶部,对吗?例如A=100得到1.000.000行,B=100得到10行,B=100应该在B=100下面吗?@Soner SQL不能自上而下工作。它以不确定的顺序处理事务,这取决于它对生成所请求的逻辑数据集的最有效访问路径的决定。谢谢!是的,它因个人而异。但我想学习,比如说;在WHERE子句in、BETWEEN、NULL中,如。。等等。哪一个应该在查询的顶部?我依赖于我的数据,我知道,但是我们可以对这些规则进行归纳吗?@Soner,不。SQL是声明性的,数据库可以以任何逻辑等效的方式自由重写查询。这就是我在where子句中放置谓词的意思,因为它们的处理顺序是由数据库决定的
Where DATE BETWEEN '01/01/2011' AND '01/02/2011'
AND NUMBER IN (156, 646)