簡體   English   中英

如何優化SQL子查詢?

[英]how to optimize SQL sub queries?

這是我的場景,我嘗試使用名稱搜索 SQL 表中的記錄。 因此,我嘗試創建一個子查詢,並且在 Postgres 中也使用了 like 運算符。 SQL 查詢它工作正常。 但這需要很多時間。 所以,我檢查了為什么要花這么多時間。 原因是子查詢。 在子查詢中,它命中表中的所有記錄。 如何優化子查詢。

SQL查詢

SELECT
id, latitude,longitude,first_name,last_name,
contact_company_id,address,address2,city,state_id,    zip,country_id,default_phone_id,last_contacted,image,contact_type_id
FROM contact
WHERE company_id = 001
AND contact_company_id IN (select id from contactcompany where lower( name ) ~*'jack')

所以,我試圖運行這個查詢,它需要 2 秒,它命中了聯系公司表中的所有記錄,只有它需要時間。 如何使用SQL優化子查詢?

請嘗試將子查詢作為與主表的內部連接,兩個查詢都給出相同的結果。

這里的例子:

SELECT  contact.id, 
        contact.latitude,
        contact.longitude,
        contact.first_name,
        contact.last_name,
        contact.contact_company_id,
        contact.address,
        contact.address2,
        contact.city,
        contact.state_id,    
        contact.zip,
        contact.country_id,
        contact.default_phone_id,
        contact.last_contacted,
        contact.image,
        contact.contact_type_id
FROM contact As contact
Inner Join contactcompany As contactcompany On contactcompany.id = contact_company_id
WHERE company_id = 001
AND  lower( name ) ~*'jack'

我將首先使用exists編寫查詢。 然后, company_id是字符串或數字。 讓我們猜測它是一個字符串,因為常量用前導零表示。 如果是這樣,請使用單引號:

SELECT c.*
FROM contact c
WHERE company_id = '001' AND
      EXISTS (SELECT 1
              FROM contactcompany cc
              WHERE cc.name ~* 'jack' AND
                    cc.id = c.contact_company_id
             );

然后在contact(compnay_id, contact_company_id)上的索引是有意義的。 對於子查詢, contactcompany(id, name)

編寫查詢可能還有其他替代方法,但您的問題沒有提供有關表大小、當前性能或數據類型的太多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM