1. 程式人生 > >SQL裡IN的用法以及優化

SQL裡IN的用法以及優化

 1.in後條件不多,可以考慮主表建索引,或用union all 代替

  2. in 和 exists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是IN,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係了 ,另外IN時不對NULL進行處理。

  3.如果in後接幾百幾千或幾萬的條件,可把in裡的條件錄入臨時表,給臨時表加索引,用表連線代替

  問題描述: id值可能有數千個之多,怎麼提高效率?

  例子:select * from table1 where id in (1,3,6,10,...,8000) and type = 1

  ************************************************************/

  --例如:

  SELECT *

  FROM tb

  WHERE id IN (1, 2, 3, 4, ........)

  AND NAME = 'best'

  --1.將括號的條件做成變數

  DECLARE @str VARCHAR(4000)

  SET @str = '1,2,3,4,5.......'

  --2.然後將@s拆分後插入臨時表

  CREATE TABLE #t

  (

  id VARCHAR(10)

  )

  DECLARE @i INT

  DECLARE @len INT

  SET @i = 1

  WHILE @i < LEN(@str + ',')

  BEGIN

  INSERT #t

  SELECT SUBSTRING(@str + ',', @i, CHARINDEX(',', @str + ',', @i) [email protected])

  SET @i = CHARINDEX(',', @str + ',', @i) + 1

  END

  --3利用臨時表和原表進行連線取值

  SELECT k.*

  FROM tb k

  INNER JOIN #t p

  ON p.id = k.id

  WHERE NAME = 'best'