[英]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.