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) -@i)
        
        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'   
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM