Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用WHERE子句优化SQL查询_Sql_Sql Server_Sql Server 2005_Where Clause - Fatal编程技术网

如何使用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%'