3

非常に単純なクエリがあります。

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

4 に答える 4

3

IDが200000を超えるエントリのみを使用して一時テーブルを作成し、それをクエリして違いが生じるかどうかを確認できます。

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

SELECT * FROM #temp WHERE description LIKE '%5488824%' ORDER BY id DESC;
于 2012-09-20T09:13:44.380 に答える
0

これが機能するかどうかを確認します。

SELECT top 100 * from
(select description FROM logs  WHERE  ID > 200000 )  s
where s.description LIKE '%5488826%'  
ORDER BY s.id DESC  
于 2012-09-20T09:13:10.037 に答える
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

または (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列にインデックスがあることを確認してください。

于 2012-09-20T09:15:47.287 に答える
-1

非常に短い答え;-)列にインデックスを追加します。

于 2012-09-20T09:13:48.763 に答える