sql - 如何编写最佳 SQL 查询

标签 sql

我在 stackoverflow 上进行了搜索,但每个人都要求优化他们已经完成的查询。

我想知道创建查询时要做什么、要避免什么的基本内容。

例如,众所周知,写作 SELECT * FROM这是要避免的事情,因为 SQL 引擎必须进行“不可见”查询才能知道应显示哪些列。

还知道between @min_number AND @max_numberId >= @min_number AND Id <= @max_number 效果更好但我不记得为什么。这可能是因为 Between 是一个由引擎在较低级别控制的句子,并创建迭代以显示以某种方式“处理”的规则。但我只是不确定。

有人可以验证这些并列出最常见的该做什么、该避免什么吗?

最佳答案

我的列表是特定于 SQL Server 的(我确信还有更多):

使用 sargable where 子句 - 这意味着在 where 子句中没有函数,尤其是标量 UDF

当您查找与第二个表不匹配的行时,WHERE NOT EXISTS 往往比使用 where id 为 null 结构的左连接更快。

相关子查询往往逐行运行,而且速度非常慢。

调用其他 View 的 View 无法建立索引,并且会变得非常慢,尤其是在大型表上有多个级别时。

应避免选择 *,特别是当您有联接时,因为至少一列会发送两次,这会浪费服务器、数据库和网络资源。

游标通常可以替换为执行速度更快的基于集合的逻辑 当您以正确的方式存储数据时,您可以避免大量即时转换。

更新时,请确保添加 where 子句,以免更新新值和旧值相同的行。这可能是更新 10,000,000 行和更新 15 行之间的区别。示例(Tsql 更新结构,如果您使用另一个数据库,您可能必须查找正确的语法,但它应该给您想法。):

Update t
set field1 = t2.field2
from table1 t
join table2 t2 on t.tid = t2.tid
Where t.field1 <> t2.field2

或者

Update t
set field1 = @variable
from table1 t
Where t.field1 <> @variable

检查您的索引。 SQL Server 不会自动索引外键。如果它们在连接中使用,通常需要对其进行索引。

如果您经常在某个字段上使用函数,则可能没有正确存储它(或者您应该有一个持久的计算字段,并且仅执行一次转换,而不是每次选择该列时都执行转换。)

您最好的选择是为您选择的数据库获取一本好的性能调优书籍(最好的是针对特定数据库的)并阅读有关编写查询的章节。

关于sql - 如何编写最佳 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5857800/

相关文章:

mysql - 如何在 MySQL 数据库中插入一系列行

java - GlassFish Server 无法连接到 SQL 数据库(SQL 驱动程序错误)

MySql 查询(大脑挑战)

c# - "Unknown column in ' 字段列表 '"知道为什么我得到它吗?

php - IF ROW_COUNT() 返回错误

php - 选择并列出 child 和 parent

sql - 仅当记录存在时才插入到 Postgres 表中

php - 将带有超链接的 html 表中的值传递到下一页的数据库查询

mysql - iReport 中的 SQL Join 语句

sql - 另一个内部的 EXEC 存储过程不等待完成