SQL笛卡爾積查詢與關聯查詢性能對比


首先聲明一下,sql會用略懂,不是專家,以下內容均為工作經驗,聊以抒情。

今天幫忙驗證同事發布的端口時,查看了一下相關sql內容,發現其使用的sql語句會導致笛卡爾積現象,為了幫其講解進行了如下分析:

student表:

teacher表:

course表:

student_course表:

與發現問題類似的SQL1查詢語句:

SELECT
    d.st_name,d.class_id,d.st_id
FROM
    course    AS a,
    student_course AS b,
    teacher AS c,
    student AS d 
WHERE
    a.cu_id = b.cu_id
    AND b.st_id = d.st_id
    AND c.dep_id = d.dep_id 
    AND a.cu_name = '英語';

采用內關聯的SQL2語句:

SELECT
    student.st_name,
    student.class_id,
    student.st_id 
FROM
    course
    JOIN student_course USING ( cu_id )
    JOIN student USING ( st_id )
    JOIN teacher USING ( dep_id )
WHERE
course.cu_name = '英語';

執行時間對比(已經多次驗證):

SELECT
    d.st_name,d.class_id,d.st_id
FROM
    course    AS a,
    student_course AS b,
    teacher AS c,
    student AS d 
WHERE
    a.cu_id = b.cu_id
    AND b.st_id = d.st_id
    AND c.dep_id = d.dep_id 
    AND a.cu_name = '英語'
> OK
> 時間: 0.002s


SELECT
    student.st_name,
    student.class_id,
    student.st_id 
FROM
    course
    JOIN student_course USING ( cu_id )
    JOIN student USING ( st_id )
    JOIN teacher USING ( dep_id )
WHERE
course.cu_name = '英語'
> OK
> 時間: 0.001s

分析原因:

在不加course.cu_name = '英語'這條約束條件時,我們對比一下查詢結果內容,如下所示SQL1查詢結果:

 

SQL2查詢結果:

可以看出SQL1結果的字段多於SQL2,當數據量很大或相關表字段更多時,通過where的條件查詢會在性能上有明顯的區別,因此建議sql編寫時注意相關方法的使用以提升性能。

只是個小實驗,詳細解釋可參考該貼:https://www.cnblogs.com/alianbog/p/5618349.html

盜圖一枚,敬請見諒。

 


免責聲明!

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



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