⑴ sql select 嵌套 優化
先看看執行計劃那部分耗時,才好解決,
先在演算法上優化,例如(select count(*)...)那個子查詢可以轉換成exists語法
再在索引上優化,例如datediff會導致DateTo欄位的索引無法使用,在WHERE以後對欄位慎用函數理由即此
最後在表設計上優化,例如適當冗餘
這三把斧基本上能解決你大部分問題,終極優化是重量級的如KEY-VALUE緩存資料庫,增加內存伺服器,建分區表,甚至上lucene,SOLOR等
⑵ SQL嵌套查詢優化
單從語句方面基本上沒有優化的地方了,可以嘗試下
SELECT count(c.CUST_NO)
FROM CI_CUS_PERSON c
LEFT JOIN CI_CUS_CERT CERT ON c.CUST_NO=CERT.CUST_NO
WHERE c.CUST_TYPE like '1%'
AND c.CUST_NO IN (SELECT CUST_NO FROM OP_ASN_CUST_INST aci WHERE ORGID IN (select eao.ORGID from eos_auth_org eao WHERE eao.OPERATORID=1)) 如果後面那個in裡面的查詢量不大的話。
可以考慮索引
OP_ASN_CUST_INST.CUST_NO,OP_ASN_CUST_INST.ORGID,
CI_CUS_PERSON.CUST_NO上面建立索引
⑶ SQL語句多層嵌套查詢很慢,怎麼優化,求方案
大致的看了下,有點暈,內嵌的幾個select只是對同一個表的部分不同條件進行分組計算,沒必要寫兩個查詢,其中還嵌套一個,我也是醉了,可以用case-when去解決這個問題。
⑷ sql查詢多層嵌套如何簡化
1、將多層嵌套查詢拆分為多個臨時表,若需要持久化可以使用物理臨時表,若是其他程序也許調用,那就用全局臨時表
2、在SQL2000時,使用臨時表,可以有效提升查詢效率
3、除了MSSQL以外,其他資料庫效果未知。
⑸ sql 嵌套查詢語句怎麼優化
最外層的SQL SELECT語句裡面的條件,你不要全部套進去,應該先把條件查出來,然後組建最外層SQL語句。簡單來說,就是將裡面的SELECT語句查出來的結果保存到變數中,然後再來將條件整合,組成最外層SQL語句。LEFT,它並不是加快查詢速度,它只不過加快結果集返回的速度。實際上,你並不能感覺到這速度的提高。不過我們還是建議,當你查詢很長字元串時(比如說記錄的標題)在頁面中顯示,可以使用LEFT在SQL服務端進行字元截取。
⑹ 標准SQL嵌套查詢語句
1、簡單子查詢
select name,age from person
where age >
(
select age from person
where name = '網路'
)
2、in嵌套查詢
select name from person
where countryid in
(
select countryid from country
where countryname = '網路'
)
(6)sql嵌套查詢優化擴展閱讀:
嵌套查詢的意思是,一個查詢語句(select-from-where)查詢語句塊可以嵌套在另外一個查詢塊的where子句中,稱為嵌套查詢,其中外層查詢也稱為父查詢,主查詢,內層查詢也稱子查詢,從查詢。
子查詢的語法規則
1、子查詢的select查詢總是使用圓括弧括起來。
2、不能包括compute或for.browse子句。
3、如果同時指定top子句,則可能只包括order by子句。
4、子查詢最多可以嵌套到32層。個別查詢可能會不支持32層嵌套。
5、任何可以使用表達式的地方都可以使用子查詢,只要它返回的是單個值。
6、如果某個表只出現在子查詢中二不出現在外部查詢中,那麼該表的列就無法包含在輸出中。
⑺ sql多重嵌套子查詢,求優化!!!!!
select MenuText from mainmenu where PermissionID in(
select distinct PermissionID from Role_Permission where RoleID
in (select RoleID from User_Roles where userid =
(select id from users where Account='seven')))
⑻ SQL要做6張表的嵌套查詢,大神們救救小弟,我只會最簡單最簡單的inner join,求大神們給優化一下代碼。
你這個並非是什麼嵌套查詢啊,只是表不止一個,有個外連接而已。你可以把所有的inner join看成是where條件。
影響速度的地方應該有2個,一個是你用inner join結合出來的數據量太大,可能抽出的重復數據太多,所以你才使用了distinct,應該想辦法去掉不需要的冗餘數據。另一個就是你用了right join,整個sql看起來貌似以b為主表,但是其實a才是主表,折騰了一堆,都是為a做鋪墊。根據各個表的數據量,把整個sql重構一下就可以了。
⑼ 請高手指導,sql如何提高嵌套查詢效率
給shop_cr 欄位加索引
not改成左外連接 + 空值判斷
select a.* from dh_w a,(
select c.picture_id from dh_proct c left outer join (
SELECT sm_proct_id FROM dh_had_upload WHERE shop_cr='IU'
union
SELECT sm_proct_id FROM dh_arrange_upload WHERE shop_cr='IU'
) d on c.id = d.sm_proct_id
where d.sm_proct_id is null
)b where a.num =b.picture_id
ORDER BY a.id limit 0,90
⑽ sql查詢優化問題 去掉了一個嵌套in查詢居然更慢了,為什嗎
如果子查詢數據量比較大的話,可以試著用exist。
1.exist,not exist一般都是與子查詢一起使用. In可以與子查詢一起使用,也可以直接in (a,b.....)
2.exist會針對子查詢的表使用索引. not exist會對主子查詢都會使用索引. in與子查詢一起使用的時候,只能針對主查詢使用索引. not in則不會使用任何索引. 注意,一直以來認為exists比in效率高的說法是不準確的。
in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。
如果查詢的兩個表大小相當,那麼用in和exists差別不大。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。