如何优化此查询?

时间:2012-08-15 11:34:42

标签: sql-server optimization

作业表中有100万条记录。以下查询的执行时间为30秒。查询不优雅,它将返回符合条件的记录数。请帮我优化。

DECLARE @MaxIdValue varchar(100)
DECLARE @SerchFilter varchar(100) = 'test'
DECLARE @TotalRowCount int = ( SELECT 
Count(*) AS [RowCount]
FROM 
[Jobs]
INNER JOIN [Sites] ON [Jobs].[SiteId] = [Sites].[Id]  
INNER JOIN [JobStatusHistory] ON [Jobs].[JobStatusHistoryId] = [JobStatusHistory].[Id]  
INNER JOIN [JobStatuses] ON [JobStatusHistory].[StatusId] = [JobStatuses].[Id]  
INNER JOIN [JobTypes] ON [Jobs].[JobTypeId] = [JobTypes].[Id]  
LEFT JOIN [Customers] ON [Jobs].[CustomerId] = [Customers].[Id]  
LEFT JOIN [Priorities] ON [Jobs].[PriorityId] = [Priorities].[Id]  
LEFT JOIN [TaskTypes] ON [Jobs].[TaskTypeId] = [TaskTypes].[Id]  
LEFT JOIN [Areas] ON [Sites].[AreaId] = [Areas].[Id]  
WHERE
( 
 [Sites].[Active]=1
 AND 
   (
    [Jobs].[OwnedByCompanyId]=18
      OR  
    [Jobs].[OwnedByCompanyId] = 0)
      AND 
    [Jobs].[Active]=1
   ) 
 AND 
   ( 
  [Customers].[Name] LIKE '%'+@SerchFilter+'%'
 OR 
   [Sites].[Name] LIKE  '%'+@SerchFilter+'%'
   OR 
 [Sites].[Address1] LIKE  '%'+@SerchFilter+'%'
    OR 
  [Sites].[Postcode] LIKE  '%'+@SerchFilter+'%'
 OR 
  [Sites].[UPRN] LIKE  '%'+@SerchFilter+'%'
 OR 
 [Sites].[Contact] LIKE  '%'+@SerchFilter+'%'
     OR 
 [Sites].[Telephone] LIKE  '%'+@SerchFilter+'%'
   OR 
 [Sites].[Work] LIKE  '%'+@SerchFilter+'%'
 OR 
  [Sites].[MobileNumber] LIKE  '%'+@SerchFilter+'%'
  OR 
  [Areas].[Description] LIKE  '%'+@SerchFilter+'%'
    OR 
   [Jobs].[Id] LIKE  '%'+@SerchFilter+'%'
  OR 
  [Jobs].[OrderNumber] LIKE  '%'+@SerchFilter+'%'
   OR 
   [Jobs].[Description_PlainText] LIKE  '%'+@SerchFilter+'%'
  OR 
   [Jobs].[JobNumber] LIKE  '%'+@SerchFilter+'%'
  OR 
  [JobTypes].[Description] LIKE  '%'+@SerchFilter+'%'
   OR 
  [TaskTypes].[Description] LIKE  '%'+@SerchFilter+'%'
     OR 
   [Priorities].[Description] LIKE  '%'+@SerchFilter+'%'
    ) 
  )

3 个答案:

答案 0 :(得分:1)

优化就是将'%'+@SerchFilter+'%'替换为@SerchFilter+'%'

where子句'%'+@SerchFilter+'%'阻止使用索引查找。

编辑:

你真的需要一次过滤掉所有这些字段吗?如果这不是一个数字,那么为什么要在Telephone字段中搜索以进行检查。

如果您使用的是SQL Server 2005或更高版本,则可以考虑使用FullText-Search

答案 1 :(得分:1)

您可能想要使用更多索引和&全文目录。

如果您使用的是MS SQL 2008,则可以检查执行计划中是否缺少索引。同样从这里你可以看到为什么这么长时间。

答案 2 :(得分:1)

假设你的连接列被适当地索引,我怀疑问题在于众多的LIKE。不幸的是,这些是相当昂贵的数据库操作。

做了类似的事情,我相信你可以通过做类似的事情来获得更好的表现:

SELECT COUNT(*) FROM ... WHERE COL1 + COL2 + COL3 + COL4 + COL5 LIKE '%SEARCH%'

而不是:

SELECT COUNT(*) FROM ... WHERE 
COL1 LIKE '%SEARCH%' 
OR COL2 LIKE '%SEARCH%'
OR COL3 LIKE '%SEARCH%'
OR COL4 LIKE '%SEARCH%'
OR COL5 LIKE '%SEARCH%'