2012-08-15 97 views
2

作業表中有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 '%'[email protected]+'%' 
OR 
    [Sites].[Name] LIKE '%'[email protected]+'%' 
    OR 
[Sites].[Address1] LIKE '%'[email protected]+'%' 
    OR 
    [Sites].[Postcode] LIKE '%'[email protected]+'%' 
OR 
    [Sites].[UPRN] LIKE '%'[email protected]+'%' 
OR 
[Sites].[Contact] LIKE '%'[email protected]+'%' 
    OR 
[Sites].[Telephone] LIKE '%'[email protected]+'%' 
    OR 
[Sites].[Work] LIKE '%'[email protected]+'%' 
OR 
    [Sites].[MobileNumber] LIKE '%'[email protected]+'%' 
    OR 
    [Areas].[Description] LIKE '%'[email protected]+'%' 
    OR 
    [Jobs].[Id] LIKE '%'[email protected]+'%' 
    OR 
    [Jobs].[OrderNumber] LIKE '%'[email protected]+'%' 
    OR 
    [Jobs].[Description_PlainText] LIKE '%'[email protected]+'%' 
    OR 
    [Jobs].[JobNumber] LIKE '%'[email protected]+'%' 
    OR 
    [JobTypes].[Description] LIKE '%'[email protected]+'%' 
    OR 
    [TaskTypes].[Description] LIKE '%'[email protected]+'%' 
    OR 
    [Priorities].[Description] LIKE '%'[email protected]+'%' 
    ) 
) 
+0

什麼數據類型的每個字段的定義?就像描述字段文本或varchar字段一樣? – 2012-08-15 11:46:45

回答

1

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

如果您使用MS SQL 2008,您可以檢查執行計劃中缺少的索引。也從這裏你可以看到爲什麼它需要這麼長時間。

1

優化將是與@SerchFilter+'%'更換'%'[email protected]+'%'

Where子句'%'[email protected]+'%'阻止使用索引seek。

編輯:

你真的需要同時在所有這些領域後進行過濾?如果這不是一個數字,爲​​什麼麻煩搜索Telephone領域的監管。

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

+0

非常感謝您的幫助。我剛剛刪除'%'+ @ SerchFilter +'%',仍然需要30秒才能完成執行。我將閱讀全文搜索。 – Larry 2012-08-15 11:55:19

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%' 
+1

只有當所有這些列都不是NULL時。 – 2012-08-15 12:17:41

+0

就像他們在我的情況。如果任何字段都是可空的,你顯然需要一個ISNULL或COALESCE在這裏... – 2012-08-15 12:29:35

+0

現在我對全文索引有一個基本的瞭解,關於我從msdn讀取的內容,我有一些問題。 – Larry 2012-08-15 13:39:44