如何使用WHERE子句优化SQL查询

时间:2012-09-20 09:08:24

标签: 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 LIKE '%5488826%'
 ORDER BY id DESC

我的想法是SQL会首先运行ID > 200000约束,这有助于加快查询速度,但仍然需要几分钟才能运行,我该怎么做才能让它运行得更快。

编辑: ID是PK并编入索引

4 个答案:

答案 0 :(得分:3)

您可以尝试创建一个只包含ID为>的条目的临时表200000,并查询它是否有任何区别:

SELECT * INTO #temp FROM logs WHERE id > 200000;

SELECT * FROM #temp WHERE description LIKE '%5488824%' ORDER BY id DESC;

答案 1 :(得分:0)

看看是否有效:

SELECT top 100 * from
(select description FROM logs  WHERE  ID > 200000 )  s
where s.description LIKE '%5488826%'  
ORDER BY s.id DESC  

答案 2 :(得分:0)

我会尝试子查询第一个约束。取决于您使用的DB,您可以尝试类似:

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

OR(对于SQL Server - 使用CTE并读取未提交的提示):

;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%'

并确保您在id列上有索引。

答案 3 :(得分:-1)

非常简短的答案;-)为列添加索引。