A. sql中的or,哪些場景會導致全表掃描
解決辦法:首先盡量避免模糊查詢,如果因為業務需要一定要使用模糊查詢,則至少保證不要使用全模糊查詢,對於右模糊查詢,即like 『…%』,是會使用索引的;左模糊like 『%...』無法直接使用索引,但可以利用reverse + function index 的形式,變化成 like 『…%』;全模糊是無法優化的,一定要的話考慮用搜索引擎。出於降低資料庫伺服器的負載考慮,盡可能地減少資料庫模糊查詢。 2、查詢條件中含有is null的select語句執行慢 原因:Oracle 9i中,查詢欄位is null時單索引失效,引起全表掃描。 解決方法:SQL語法中使用NULL會有很多麻煩,最好索引列都是NOT NULL的;對於is null,可以建立組合索引,nvl(欄位,0),對表和索引analyse後,is null查詢時可以重新啟用索引查找,但是效率還不是值得肯定;is not null 時永遠不會使用索引。一般數據量大的表不要用is null查詢。 3、查詢條件中使用了不等於操作符(、!=)的select語句執行慢 原因:SQL中,不等於操作符會限制索引,引起全表掃描,即使比較的欄位上有索引 解決方法:通過把不等於操作符改成or,可以使用索引,避免全表掃描。
B. 會引起全表掃描的幾種SQL
解決辦法:首先盡量避免模糊查詢,如果因為業務需要一定要使用模糊查詢,則至少保證不要使用全模糊查詢,對於右模糊查詢,即like 『…%』,是會使用索引的;左模糊like 『%...』無法直接使用索引,但可以利用reverse + function index 的形式,變化成 like 『…%』;全模糊是無法優化的,一定要的話考慮用搜索引擎。出於降低資料庫伺服器的負載考慮,盡可能地減少資料庫模糊查詢。 2、查詢條件中含有is null的select語句執行慢 原因:Oracle 9i中,查詢欄位is null時單索引失效,引起全表掃描。 解決方法:SQL語法中使用NULL會有很多麻煩,最好索引列都是NOT NULL的;對於is null,可以建立組合索引,nvl(欄位,0),對表和索引analyse後,is null查詢時可以重新啟用索引查找,但是效率還不是值得肯定;is not null 時永遠不會使用索引。一般數據量大的表不要用is null查詢。 3、查詢條件中使用了不等於操作符(、!=)的select語句執行慢 原因:SQL中,不等於操作符會限制索引,引起全表掃描,即使比較的欄位上有索引 解決方法:通過把不等於操作符改成or,可以使用索引,避免全表掃描。例如,把column』aaa』,改成column』aaa』,就可以使用索引了。 4、使用組合索引,如果查詢條件中沒有前導列,那麼索引不起作用,會引起全表掃描;但是從Oracle9i開始,引入了索引跳躍式掃描的特性,可以允許優化器使用組合索引,即便索引的前導列沒有出現在WHERE子句中。例如:create index skip1 on emp5(job,empno); 全索引掃描 select count(*) from emp5 where empno=7900; 索引跳躍式掃描 select /*+ index(emp5 skip1)*/ count(*) from emp5 where empno=7900; 前一種是全表掃描,後一種則會使用組合索引。 5、or語句使用不當會引起全表掃描 原因:where子句中比較的兩個條件,一個有索引,一個沒索引,使用or則會引起全表掃描。例如:where A=:1 or B=:2,A上有索引,B上沒索引,則比較B=:2時會重新開始全表掃描。 6、組合索引,排序時應按照組合索引中各列的順序進行排序,即使索引中只有一個列是要排序的,否則排序性能會比較差。例如:create index skip1 on emp5(job,empno,date); select job,empno from emp5 where job=』manager』and empno=』10』 order by job,empno,date desc; 實際上只是查詢出符合job=』manager』and empno=』10』條件的記錄並按date降序排列,但是寫成order by date desc性能較差。 7、Update 語句,如果只更改1、2個欄位,不要Update全部欄位,否則頻繁調用會引起明顯的性能消耗,同時帶來大量日誌。 8、對於多張大數據量(這里幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。 9、select count(*) from table;這樣不帶任何條件的count會引起全表掃描,並且沒有任何業務意義,是一定要杜絕的。 10、sql的where條件要綁定變數,比如where column=:1,不要寫成where column=『aaa』,這樣會導致每次執行時都會重新分析,浪費CPU和內存資源。
C. SQL中哪些情況會引起全表掃描
解決辦法:首先盡量避免模糊查詢,如果因為業務需要一定要使用模糊查詢,則至少保證不要使用全模糊查詢,對於右模糊查詢,即like
『…%』,是會使用索引的;左模糊like
『%...』無法直接使用索引,但可以利用reverse
+
function
index
的形式,變化成
like
『…%』;全模糊是無法優化的,一定要的話考慮用搜索引擎。出於降低資料庫伺服器的負載考慮,盡可能地減少資料庫模糊查詢。
2、查詢條件中含有is
null的select語句執行慢
原因:oracle
9i中,查詢欄位is
null時單索引失效,引起全表掃描。
解決方法:sql語法中使用null會有很多麻煩,最好索引列都是not
null的;對於is
null,可以建立組合索引,nvl(欄位,0),對表和索引analyse後,is
null查詢時可以重新啟用索引查找,但是效率還不是值得肯定;is
not
null
時永遠不會使用索引。一般數據量大的表不要用is
null查詢。
3、查詢條件中使用了不等於操作符(、!=)的select語句執行慢
原因:sql中,不等於操作符會限制索引,引起全表掃描,即使比較的欄位上有索引
解決方法:通過把不等於操作符改成or,可以使用索引,避免全表掃描
D. SQL中哪些情況會引起全表掃描
解決辦法:首先盡量避免模糊查詢,如果因為業務需要一定要使用模糊查詢,則至少保證不要使用全模糊查詢,對於右模糊查詢,即like 『…%』,是會使用索引的;左模糊like 『%...』無法直接使用索引,但可以利用reverse + function index 的形式,變化成 like 『…%』;全模糊是無法優化的,一定要的話考慮用搜索引擎。出於降低資料庫伺服器的負載考慮,盡可能地減少資料庫模糊查詢。 2、查詢條件中含有is null的select語句執行慢 原因:Oracle 9i中,查詢欄位is null時單索引失效,引起全表掃描。 解決方法:SQL語法中使用NULL會有很多麻煩,最好索引列都是NOT NULL的;對於is null,可以建立組合索引,nvl(欄位,0),對表和索引analyse後,is null查詢時可以重新啟用索引查找,但是效率還不是值得肯定;is not null 時永遠不會使用索引。一般數據量大的表不要用is null查詢。 3、查詢條件中使用了不等於操作符(、!=)的select語句執行慢 原因:SQL中,不等於操作符會限制索引,引起全表掃描,即使比較的欄位上有索引 解決方法:通過把不等於操作符改成or,可以使用索引,避免全表掃描
E. SQL中哪些情況會引起全表掃描
1、模糊查詢效率很低:
原因:like本身效率就比較低,應該盡量避免查詢條件使用like;對於like 『%...%』(全模糊)這樣的條件,是無法使用索引的,全表掃描自然效率很低;另外,由於匹配演算法的關系,模糊查詢的欄位長度越大,模糊查詢效率越低。
解決辦法:首先盡量避免模糊查詢,如果因為業務需要一定要使用模糊查詢,則至少保證不要使用全模糊查詢,對於右模糊查詢,即like 『…%』,是會使用索引的;左模糊like
『%...』無法直接使用索引,但可以利用reverse + function index 的形式,變化成 like 『…%』;全模糊是無法優化的,一定要的話考慮用搜索引擎。出於降低資料庫伺服器的負載考慮,盡可能地減少資料庫模糊查詢。
2、查詢條件中含有is null的select語句執行慢
原因:Oracle 9i中,查詢欄位is null時單索引失效,引起全表掃描。
解決方法:SQL語法中使用NULL會有很多麻煩,最好索引列都是NOT NULL的;對於is null,可以建立組合索引,nvl(欄位,0),對表和索引analyse後,is null查詢時可以重新啟用索引查找,但是效率還不是值得肯定;is not null 時永遠不會使用索引。一般數據量大的表不要用is null查詢。
3、查詢條件中使用了不等於操作符(<>、!=)的select語句執行慢
原因:SQL中,不等於操作符會限制索引,引起全表掃描,即使比較的欄位上有索引
解決方法:通過把不等於操作符改成or,可以使用索引,避免全表掃描。例如,把column<>』aaa』,改成column<』aaa』 or column>』aaa』,就可以使用索引了。4、or語句使用不當會引起全表掃描
原因:where子句中比較的兩個條件,一個有索引,一個沒索引,使用or則會引起全表掃描。例如:where A==1 or B==2,A上有索引,B上沒索引,則比較B=:2時會重新開始全表掃描。
5、組合索引,排序時應按照組合索引中各列的順序進行排序,即使索引中只有一個列是要排序的,否則排序性能會比較差。
例如:create index skip1 on emp5(job,empno,date);
select job,empno from emp5 where job=』manager』and empno=』10』 order by job,empno,date desc;
實際上只是查詢出符合job=』manager』and empno=』10』條件的記錄並按date降序排列,但是寫成order by date desc性能較差。
6、Update 語句,如果只更改1、2個欄位,不要Update全部欄位,否則頻繁調用會引起明顯的性能消耗,同時帶來大量日誌。
7、對於多張大數據量(這里幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。
8、select count(*) from table;這樣不帶任何條件的count會引起全表掃描,並且沒有任何業務意義,是一定要杜絕的。
F. SQL資料庫,經常不用索引時,會掃到整個表是什麼原因
在資料庫操作中,一個全表掃描(full table scan)可能是整個應用的瓶頸,因此,我們盡量
要避免不必要的全表掃描。而如果你發現一條sql是全表掃描,一般的解決步驟是:
1、運行執行計劃獲得具體的sql語句查詢分析:
方法:explain sql;
分析:至少能或得這些信息,1、表的join順序(按計劃的上到下join), 2、是否
使用索引,3、可能會使用的索引
2、添加對應的索引,或是重寫查詢sql,或更換join順序等
3、如果查詢對當前的結構不滿意,可以考慮重建表
下面分別說一下全表掃描可能發生的情形:
1、在on或者where字句中,使用的列沒有索引,可以考慮加一個索引
2、表很小,大約少於10行,這個沒有什麼危害,因為即使你有索引,優化器也會判斷
在邊讀索引邊取數據時,直接全表掃描快些
3、你在一個where字句中使用含有索引的列,但這個列的值很集中化,比如欄位 gender,
這個的值就兩個值male 和 female,如果使用索引反而會慢些,不使用索引會更快,這
種情況不用擔心
4、這個跟第三條類似,就是當你的一個索引,他的每個鍵對應多個值,即基數很低
(low cardinality),因此可能會選擇全表掃描
下面說一下對與避免發生全部掃描的時間:
1、對於使用or查詢的語句,這種查詢可能會產生全表掃描,他的策略是以一個一個比較
如果符合要求,則選出來,但這樣的操作會很慢,我們可以用union來做這樣的查詢,
當然union要快的前提是,你對兩個條件都有索引,如:
select * from table1 where key1 < 10 or key2 > 60
可以更改為:
select * from table1 where key1 < 10 union select * from table1 where key2 >60
2、對於使用memory引擎的,建立索引時,默認是hash索引,這個的支出的訪問單行數據很快,
但如果你有類似的范圍操作如>= , <= , between 時,可以考慮建立索引用btree類型的,方法為:
create index index_name on table(col_name) using btree;
3、當你分析確定必須使用某個索引,但執行計劃卻不使用該索引,可以使用force index,方法為:
select * from table_name force index index_name where clause
4、使用analyze table table_name來更新索引的鍵的分布,這個會影響jion表的順序
用索引和用不到索引的區別:
G. SQL語句在什麼情況下使用全表掃描
下面簡單介紹SQL中哪些情況會引起全表掃描。
1、模糊查詢效率很低:
原因:like本身效率就比較低,應該盡量避免查詢條件使用like;對於like
『%...%』(全模糊)這樣的條件,是無法使用索引的,全表掃描自然效率很低;另外,由於匹配演算法的關系,模糊查詢的欄位長度越大,模糊查詢效率越低。
2、查詢條件中含有is
null的select語句執行慢
3
、查詢條件中使用了不等於操作符(<>、!=)的select語句執行慢
原因:SQL中,不等於操作符會限制索引,引起全表掃描,即使比較的欄位上有索引
4、or語句使用不當會引起全表掃描
原因:where子句中比較的兩個條件,一個有索引,一個沒索引,使用or則會引起全表掃描。例如:where
A==1
or
B==2,A上有索引,B上沒索引,則比較B==2時會重新開始全表掃描。
5、組合索引
,排序時應按照組合索引中各列的順序進行排序,即使索引中只有一個列是要排序的,否則排序性能會比較差。
6、Update
語句
,如果只更改1、2個欄位,不要Update全部欄位,否則頻繁調用會引起明顯的性能消耗,同時帶來大量日誌。
7
、對於多張大數據量(
這里幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。
參考資料:
http://www.studyofnet.com/news/131.html
希望以上的回答能夠幫助你!
H. SQL SERVER中什麼情況會導致索引查找變成索引掃描
1:隱式轉換會導致執行計劃從索引查找(Index Seek)變為索引掃描(Index Scan)
Implicit Conversion will cause index scan instead of index seek. While implicit conversions occur in SQL Server to allow data evaluations against different data types, they can introce performance problems for specific data type conversions that result in an index scan occurring ring the execution. Good design practices and code reviews can easily prevent implicit conversion issues from ever occurring in your design or workload.
I. SQL全自動掃描入侵工具在掃的時候為什麼會出現這個問題
SQL全自動掃描入侵工具是會出現這樣的問題,建議你使用domain3.5,功能和各個方面都還不錯
J. SQL SERVER中什麼情況會導致索引查找變成索引掃描
SQL SERVER中什麼情況會導致索引查找變成索引掃描
SQL Server 中什麼情況會導致其執行計劃從索引查找(Index Seek)變成索引掃描(Index Scan)呢? 下面從幾個方面結合上下文具體場景做了下測試、總結、歸納。