當前位置:首頁 » 編程語言 » sqlwherein優化

sqlwherein優化

發布時間: 2023-02-18 05:35:37

1. sql優化 - 避免使用 IN 和 NOT IN

1、效率低

2、容易出現問題,或查詢結果有誤 (不能更嚴重的缺點)

1、用 EXISTS 或 NOT EXISTS 代替

select * from test1
where EXISTS (select * from test2 where id2 = id1 )
select * FROM test1
where NOT EXISTS (select * from test2 where id2 = id1 )

2、用JOIN 代替

select id1 from test1
INNER JOIN test2 ON id2 = id1
select id1 from test1
LEFT JOIN test2 ON id2 = id1
where id2 IS NULL
妥妥的沒有問題了!

PS:那我們死活都不能用 IN 和 NOT IN 了么?並沒有,一位大神曾經說過,如果是確定且有限的集合時,可以使用。如 IN (0,1,2)。

2. sql IN語句如何優化

樓主測一下結果集是否正確

declare @lFAD01 int
set @lFAD01 = 605

SELECT
case a.VBL04 when 2 then '門診掛號' else '門診收費' end 業務類別
, b.AAO02 支付類型
, a.VBL14 支付方式
, SUM(case a.VBL05 when 4 then a.VBL13 else 0 END) 退費
, SUM(case a.VBL05 when 4 then 0 else a.VBL13 END) 收費
, SUM(a.VBL13) 實收

FROM V_VBL_Full a
JOIN AAO1 b ON a.VBL15 = b.AAO01
JOIN vaa1 c ON c.vaa01 = a.vaa01
WHERE VBL17 = @lFAD01 and a.VBL04 >= 2 and a.VBL04 <= 3
and not exists(select 1 from IAS1 where IAS1.VAK01=a.VAK01)
AND NOT EXISTS(SELECT 1 FROM V_VBL_Full AS a1 WHERE (a1.VBL01=a.VBL01 OR a.VBL01A=a1.VBL01) AND EXISTS(SELECT 1 FROM IAS1 WHERE VAK01=a1.VAK01))

GROUP BY case a.VBL04 when 2 then '門診掛號' else '門診收費' END,b.AAO02,a.VBL14

3. sql select where in的優化要怎樣做

select * from aa where id in (select * from bb)

可以這樣寫的,後面的*號改成需要的欄位名

4. sql 語句 in的優化。

假設原來的句子是
select * from t1 where t1.f1 in (select t2.f2 from t2 where t2.f2=xxx)
和你的很類似
你用子查詢 很慢
我們現在修改為:
select t1.* from t1 ,t2 where t1.f1 = t2.f2 and t2.f2=xxxx
這里使用了關聯查詢代替了子查詢大大提高效率。
其次你可以考慮在表t1.f1上加索引,提高查詢速度。

5. SQL中in後面跟的數組數據量過大時報錯怎麼優化

解決辦法,使用臨時表: 第一步:創建臨時表,並將in內的數據插入到表中 select * into # from (select '1' num union allselect '2' union allselect '3' union all.....select 'N') a第二步:執行in查詢 select * from 表 where 列 in(select ...

6. 項目中優化sql語句執行效率的方法是什麼

1. SQL優化的原則是:將一次操作需要讀取的BLOCK數減到最低,即在最短的時間達到最大的數據吞吐量。 調整不良SQL通常可以從以下幾點切入: ? 檢查不良的SQL,考慮其寫法是否還有可優化內容 ? 檢查子查詢 考慮SQL子查詢是否可以用簡單連接的方式進行重新書寫 ? 檢查優化索引的使用 ? 考慮資料庫的優化器 2. 避免出現SELECT * FROM table 語句,要明確查出的欄位。 3. 在一個SQL語句中,如果一個where條件過濾的資料庫記錄越多,定位越准確,則該where條件越應該前移。 4. 查詢時盡可能使用索引覆蓋。即對SELECT的欄位建立復合索引,這樣查詢時只進行索引掃描,不讀取數據塊。 5. 在判斷有無符合條件的記錄時建議不要用SELECT COUNT (*)和select top 1 語句。 6. 使用內層限定原則,在拼寫SQL語句時,將查詢條件分解、分類,並盡量在SQL語句的最里層進行限定,以減少數據的處理量。 7. 應絕對避免在order by子句中使用表達式。 8. 如果需要從關聯表讀數據,關聯的表一般不要超過7個。 9. 小心使用 IN 和 OR,需要注意In集合中的數據量。建議集合中的數據不超過200個。 10. <> 用 < 、 > 代替,>用>=代替,<用<=代替,這樣可以有效的利用索引。 11. 在查詢時盡量減少對多餘數據的讀取包括多餘的列與多餘的行。 12. 對於復合索引要注意,例如在建立復合索引時列的順序是F1,F2,F3,則在where或order by子句中這些欄位出現的順序要與建立索引時的欄位順序一致,且必須包含第一列。只能是F1或F1,F2或F1,F2,F3。否則不會用到該索引。 13. 多表關聯查詢時,寫法必須遵循以下原則,這樣做有利於建立索引,提高查詢效率。格式如下select sum(table1.je) from table1 table1, table2 table2, table3 table3 where (table1的等值條件(=)) and (table1的非等值條件) and (table2與table1的關聯條件) and (table2的等值條件) and (table2的非等值條件) and (table3與table2的關聯條件) and (table3的等值條件) and (table3的非等值條件)。 注:關於多表查詢時from 後面表的出現順序對效率的影響還有待研究。 14. 子查詢問題。對於能用連接方式或者視圖方式實現的功能,不要用子查詢。例如:select name from customer where customer_id in ( select customer_id from order where money>1000)。應該用如下語句代替:select name from customer inner join order on customer.customer_id=order.customer_id where order.money>100。 15. 在WHERE 子句中,避免對列的四則運算,特別是where 條件的左邊,嚴禁使用運算與函數對列進行處理。比如有些地方 substring 可以用like代替。 16. 如果在語句中有not in(in)操作,應考慮用not exists(exists)來重寫,最好的辦法是使用外連接實現。 17. 對一個業務過程的處理,應該使事物的開始與結束之間的時間間隔越短越好,原則上做到資料庫的讀操作在前面完成,資料庫寫操作在後面完成,避免交叉。 18. 請小心不要對過多的列使用列函數和order by,group by等,謹慎使用disti軟體開發t。 19. 用union all 代替 union,資料庫執行union操作,首先先分別執行union兩端的查詢,將其放在臨時表中,然後在對其進行排序,過濾重復的記錄。 當已知的業務邏輯決定query A和query B中不會有重復記錄時,應該用union all代替union,以提高查詢效率。

7. sql in 執行效率低 如何優化

你這樣不好,in,exists都是子查詢
你應該考慮連接查詢,這樣速度快很多。

以樓上兄弟為例子:

SELECT sum(*)
FROM pas_guiyyw
WHERE exists (SELECT 1
FROM subTable

WHERE subTable.rule='ruleContext'
AND pas_guiyyw.id= subTable.id )

應該修改為:
SELECT sum(*)
FROM pas_guiyyw a,
subTable b WHERE
a.id= b.id
and b.rule='ruleContext'

這樣效率高很多。

8. 怎麼優化 where中含有in 的sql

可以把IN換成LEFT JOIN 加上IS NOT NULL 的這種寫法 LEFT JOIN 效率比較高

9. SQL子查詢中IN太多,該如何優化讓查詢速度更快

in可以用exists代替,原則上集合數少用IN比較快,集合數據大用exists比較好


10. 對於如何寫where條件優化sql語句的方法

1、說明:復製表(只復制結構,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a

2、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;

3、說明:跨資料庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from b in 『具體資料庫』 where 條件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、說明:子查詢(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、說明:顯示文章、提交人和最後回復時間
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、說明:外連接查詢(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、說明:在線視圖查詢(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、說明:between的用法,between限制查詢數據范圍時包括了邊界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 數值1 and 數值2

9、說明:in 的使用方法
select * from table1 where a [not] in (『值1』,』值2』,』值4』,』值6』)

10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、說明:四表聯查問題:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、說明:日程安排提前五分鍾提醒
SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5

13、說明:一條sql 語句搞定資料庫分頁
select top 10 b.* from (select top 20 主鍵欄位,排序欄位 from 表名 order by 排序欄位 desc) a,表名 b where b.主鍵欄位 = a.主鍵欄位 order by a.排序欄位

14、說明:前10條記錄
select top 10 * form. table1 where 范圍

15、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重復行而派生出一個結果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、說明:隨機取出10條數據
select top 10 * from tablename order by newid()

18、說明:隨機選擇記錄
select newid()

19、說明:刪除重復記錄
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

20、說明:列出資料庫里所有的表名
select name from sysobjects where type='U'

21、說明:列出表裡的所有的
select name from syscolumns where id=object_id('TableName')

經典SQL語句集錦

熱點內容
已上傳附件 發布:2024-11-08 11:47:53 瀏覽:633
電腦配置都有哪些問題 發布:2024-11-08 11:15:29 瀏覽:727
新浪微博敏感詞資料庫 發布:2024-11-08 11:03:22 瀏覽:472
linux的終端軟體 發布:2024-11-08 11:01:46 瀏覽:204
主機如何把密碼關掉 發布:2024-11-08 10:36:25 瀏覽:720
安卓軟體如何鎖定 發布:2024-11-08 10:30:27 瀏覽:709
sql定時執行語句 發布:2024-11-08 10:29:36 瀏覽:673
邁銳寶xl值得入手哪個配置 發布:2024-11-08 10:14:13 瀏覽:634
尋歡加密 發布:2024-11-08 10:02:57 瀏覽:353
拼單源碼 發布:2024-11-08 09:58:24 瀏覽:143