我有一个非常简单的查询。
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 和索引<</p>
尝试创建一个仅包含 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 description FROM logs WHERE ID > 200000 ) s
where s.description LIKE '%5488826%'
ORDER BY s.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
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
列上有索引。
非常简短的答案;-)向列添加索引。