當前位置:首頁 » 編程語言 » sql怎麼避免全表查詢
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql怎麼避免全表查詢

發布時間: 2022-07-23 02:55:16

❶ 這條sql語句 如何能避免全表掃描,增快查詢速度,下面4個欄位都建立了索引

避免用not in ,not like, <>等等操作
如果是4個欄位的組合索引那麼要注意使用時候的欄位順序
另外提醒下索引使用不當反而會導致查詢效率低下
一句兩句講不清楚的,看你自己的經驗了

❷ SQL語句中全表掃描是什麼意思,如何讓SQL語句不進行全表掃描

會引起全表掃描的幾種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、使用組合索引,如果查詢條件中沒有前導列,那麼索引不起作用,會引起全表掃描;但是從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和內存資源。

❸ SQL語言 怎麼不全表掃描直接提取最新一次的記錄

按times desc建立索引,直接使用select top 1 * from data進行查詢

❹ sql server多表查詢如何避免重復值

我不知道你要的意義是什麼,你查出來的
編號 名稱
001 EE
001 DD
001 CC
如果是你想要的結果,那肯定是不能寫到D裡面去的,因為D是以編號為主鍵。

但是如果你單純想把結果插入到D中去,那就用distinct,但是名稱那一列你是沒法合並的
你只能插入編號這一列到D
select distinct(編號) from XX

❺ 如何提高sql查詢效率

轉帖一下

1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

2.應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:
select id from t where num=0

3.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

4.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20

5.in 和 not in 也要慎用,否則會導致全表掃描,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3

6.下面的查詢也將導致全表掃描:
select id from t where name like '%abc%'
若要提高效率,可以考慮全文檢索。

7.如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變數,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num=@num
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num=@num

8.應盡量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2

9.應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
select id from t where datediff(day,createdate,'2005-11-30')=0--『2005-11-30』生成的id
應改為:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

10.不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

11.在使用索引欄位作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致。

12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0
這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(...)

13.很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)

14.並不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有欄位sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。

15.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。

16.應盡可能的避免更新 clustered 索引數據列,因為 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那麼需要考慮是否應將該索引建為 clustered 索引。

17.盡量使用數字型欄位,若只含數值信息的欄位盡量不要設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。

18.盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的欄位內搜索效率顯然要高些。

19.任何地方都不要使用 select * from t ,用具體的欄位列表代替「*」,不要返回用不到的任何欄位。

20.盡量使用表變數來代替臨時表。如果表變數包含大量數據,請注意索引非常有限(只有主鍵索引)。

21.避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

22.臨時表並不是不可使用,適當地使用它們可以使某些常式更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對於一次性事件,最好使用導出表。

23.在新建臨時表時,如果一次性插入數據量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然後insert。

24.如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。

25.盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫。

26.使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。

27.與臨時表一樣,游標並不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。在結果集中包括「合計」的常式通常要比使用游標執行的速度快。如果開發時 間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。

28.在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執行存儲過程和觸發器的每個語句後向客戶端發送 DONE_IN_PROC 消息。

29.盡量避免大事務操作,提高系統並發能力。

30.盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理

❻ sql語句子查詢很多 怎麼優化

舉個例子,比如要搜索的條件很多?

❼ 表中數據有百分以上,查詢sql怎麼優化

查詢時盡量避免全表掃描
查詢時盡量使用索引欄位過濾
使用子查詢

❽ SQL資料庫內表太多,查詢一次要半個多小時,如何優化

你說的是騰訊泄漏的那個QQ群資料庫吧!!
for GroupData = 1 to 11
conn.open "PROVIDER=SQLOLEDB;DATA SOURCE=****;UID=sa;PWD=sa;DATABASE=GroupData"&GroupData
for Group = (GroupData-1)*100+1 to (GroupData)*100
exec = "SELECT * FROM Group"&Group&" where QQNum = 375000016"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
if not rs.eof then
response.write(Rs("Nick")+"<br>")
else
response.write("表"&Group&"沒有記錄"+"<br>")
end if
rs.close
next
next

❾ 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表的順序


用索引和用不到索引的區別: