如何使用WHERE子句优化SQL查询
我有一个非常简单的问题如何使用WHERE子句优化SQL查询,sql,sql-server,sql-server-2005,where-clause,Sql,Sql Server,Sql Server 2005,Where Clause,我有一个非常简单的问题 SELECT top 100 * FROM logs WHERE description LIKE '%5488826%' ORDER BY id DESC 但是,它包含一个LIKE子句,该子句正在搜索较大的文本字段 我知道这个表只有(例如)200200行 (我只对查找id>200000的行中发生的事情感兴趣) 我试图通过添加 SELECT top 100 * FROM logs WHERE ID > 200000 AND description LI
SELECT top 100 *
FROM logs
WHERE description LIKE '%5488826%'
ORDER BY id DESC
但是,它包含一个LIKE子句,该子句正在搜索较大的文本字段
我知道这个表只有(例如)200200行
(我只对查找id>200000的行中发生的事情感兴趣)
我试图通过添加
SELECT top 100 *
FROM logs
WHERE ID > 200000
AND description LIKE '%5488826%'
ORDER BY id DESC
我的想法是,SQL将首先运行ID>200000
约束,这将有助于加快查询速度,但运行仍然需要几分钟,我应该做些什么来加快运行速度
编辑:
ID是PK和索引的看看这是否有效:
SELECT top 100 * from
(select description FROM logs WHERE ID > 200000 ) s
where s.description LIKE '%5488826%'
ORDER BY s.id DESC
您可以尝试创建一个临时表,其中只包含id>200000的条目,并查询这些条目以查看是否有任何区别:
SELECT * INTO #temp FROM logs WHERE id > 200000;
SELECT * FROM #temp WHERE description LIKE '%5488824%' ORDER BY id DESC;
非常简短的回答;-)向列添加索引。我会尝试子查询第一个约束。根据您使用的数据库,您可以尝试以下操作:
SELECT TOP 100 * FROM (
SELECT ID, description FROM logs WHERE ID > 200000
) AS data
JOIN
logs
ON
logs.id = data.id
WHERE
data.description LIKE '%5488826%'
ORDER BY
ID DESC
或者(对于SQL Server--使用CTE和读取未提交提示):
并确保您在
id
列上有索引。一个解释给您带来了什么?如果您真的有200200行,您可能会认为优化器确实会按照您的建议执行,这需要一秒钟左右的时间。(除非“较大”表示“兆字节”,否则至少)1。你的数据库管理系统是什么?2.向我们展示你的解释计划输出我在MS SQL Server中,我猜解释是查询分析器,将检查它…如果你没有索引(听起来好像你没有使用它们),你需要。请发布执行计划。假设ID
是聚集索引,我希望它只会反向扫描它,并在找到100个匹配行或它到达ID范围的末尾时停止。也许延迟是因为其他原因(例如,被长期持有的开放事务阻塞)解释了为什么索引(在每一列上)会有帮助?我喜欢你们提出查询优化建议而没有看到它的实际执行计划;)哦,我的意思是:在“id”和“description”列中添加索引
;WITH data AS (
SELECT ID, description FROM logs WITH (NOLOCK) WHERE ID > 200000
)
SELECT
logs.*
FROM
data
JOIN
logs WITH (NOLOCK)
ON
logs.id = data.id
WHERE
data.description LIKE '%5488826%'