2013-07-25 275 views
2

想知道是否有人可以幫助我。我有兩張桌子。表A包含數百萬行,我查看整個表,表B包含大約5萬行,並且再次查看整個表。我使用下面的查詢:SQL查詢花費太長時間

SELECT t1.ID as [ID], count(*) as [Total] 
FROM table1 t1 
RIGHT JOIN table2 t2 ON t1.data LIKE '%' + t2.field3 + '%' 
AND t1.ID = t2.ID 

WHERE t1.ID not LIKE '' 
GROUP BY t1.ID, t1.datetime 

我使用右連接的原因是因爲,據我所知,它會從T2的所有記錄(這是我想要的),只有那些與它們匹配從t1開始。另外,我已經將'AND t1.ID = t2.ID'添加到SELECT語句中,因爲我認爲這會加快查詢速度(不會查找與t2中的值不匹配的ID),儘管這可能會被RIGHT JOIN,除非我的邏輯完全錯誤。另外,如果我只能解釋JOIN背後的邏輯 - table1中的數據列包含很多'stuff',並且其中的某個地方應該與t2.field3中的內容完全相同,例如, t1.data ='^ ABCD^00dasdas ^£ldasl32^XL0005 ^'和t2.field3將包含'XL0005'。

任何幫助表示讚賞。

感謝

+1

你的'WHERE'子句應該是'WHERE t1.ID <>''' –

+1

你使用哪個DBMS? MySQL Oracle DB2 .. – Joni

+0

如果速度是一個問題,你有什麼索引在你的表上? – DaveRlz

回答

0

這可能有點更好地履行假定ID列索引:

SELECT 
    t1.ID as [ID], count(*) as [Total] 
FROM 
    table2 t2 
    INNER JOIN table1 t1 ON t2.ID=t1.ID AND t1.ID <> '' 
WHERE CHARINDEX(t2.field3, t1.data) > 0 
GROUP BY t1.ID, t1.datetime 

也請記住,如LIKE「%」 +柱+「%」或CHARINDEX操作做不要在涉及的列中使用任何索引。因此,如果你必須堅持特定的方法,你不應該期待巨大的進步。

0

如果你在子查詢

SELECT t1.ID as [ID], count(*) as [Total] 
FROM (select t1.ID as [ID] 
      ,t1.datetime as [DATETIME] 
      ,t1.data as [DATA] 
      ,t2.field3 as [FEILD3] table1 t1 
      RIGHT JOIN table2 t2 ON t1.ID = t2.ID 
     HAVING FIELD2 is not null AND DATA LIKE '%' + FIELD3 + '%') as t1 

WHERE t1.ID not LIKE '' 
GROUP BY t1.ID, t1.datetime 
0

還可以將一些邏輯問題是您正在使用像,像真正的是性能殺手。

我更改查詢請看看它是否解決了目的

SELECT ID, 
     COUNT(*) 
     (SELECT t.*, 
       CHARINDEX(t1.data,t2.field3) PRESENT 
      FROM table1 t1 
     RIGHT JOIN table2 t2 
      ON t1.ID = t2.ID)TEMP 
WHERE ID <> '' 
    AND PRESENT > 0 
GROUP BY ID, datetime 

也可以嘗試把指數data & field3
試試這個。