1. 程式人生 > >sql優化(where條件中的''in''在邏輯上相當於............)

sql優化(where條件中的''in''在邏輯上相當於............)

         sql優化的實質就是在結果正確的前提下,用優化器可以識別的語句,充分利用索引,減少表掃描的I/O次數,儘量避免表搜尋的發生。


        select count(*) from stuff where id_no in(''0'',''1'')(23秒)

         where條件中的''in''在邏輯上相當於''or'',所以語法分析器會將in (''0'',''1'')轉化為id_no =''0'' or id_no=''1''來執行。我們期望它會根據每個or子句分別查詢,再將結果相加,這樣可以利用id_no上的索引;但實際上(根據showplan),它卻採用了"OR策略",即先取出滿足每個or子句的行,存入臨時資料庫的工作表中,再建立唯一索引以去掉重複行,最後從這個臨時表中計算結果。因此,實際過程沒有利用id_no上索引,並且完成時間還要受tempdb資料庫效能的影響。   

         實踐證明,表的行數越多如果有620000行時,執行時間竟達到220秒!還不如將or子句分開:  

        select count(*) from stuff where id_no=''0''  

        select count(*) from stuff where id_no=''1'' 

        得到兩個結果,再作一次加法合算。因為每句都使用了索引,執行時間只有3秒,在620000行下,時間也只有4秒。或者,用更好的方法,寫一個簡單的儲存過程:  

create proc count_stuff as  declare @a int  declare @b int  declare @c int  

declare @d char(10)  begin  
select @a=count(*) from stuff where id_no=''0''  select @b=count(*) from stuff where id_no=''1''  end  
select @[email protected][email protected]  
select @d=convert(char(10),@c)  print @d 
 
  直接算出結果,執行時間同上面一樣快!   
  總結:  
  可見,所謂優化即where子句利用了索引,不可優化即發生了表掃描或額外開銷。   
  1.任何對列的操作都將導致表掃描,它包括資料庫函式、計算表示式等等,查詢時要儘可能將操作移至等號右邊。   
 2.in、or子句常會使用工作表,使索引失效;如果不產生大量重複值,可以考慮把子句拆開;拆開的子句中應該包含索引。 
  3.要善於使用儲存過程,它使SQL變得更加靈活和高效。   
                 上述這些只是在應用層次的一種體現,深入研究還會涉及資料庫層的資源配置、網路層的流量控制以及作業系統層的總體設計

相關推薦

sql優化where條件的''in''在邏輯相當............

         sql優化的實質就是在結果正確的前提下,用優化器可以識別的語句,充分利用索引,減少表掃描的I/O次數,儘量避免表搜尋的發生。         select count(*) from stuff where id_no in(''0'',''1'')(2

MySQL - 如何提高SQL的查詢效率where條件優化

目錄 說在前面 35條優化規則 總結 說在前面 整天說SQL優化,SQL優化,到底怎麼才算是SQL優化呢,下面從百度總結了一些關於Oracle裡常用的一些有效的優化方法。僅供參考,文章內容來源於網路。 35條優化規則 (1)優先考慮建立索引 對查詢進行優化,應

Oracle - 如何提高SQL的查詢效率where條件優化

目錄 說在前面 34條優化規則 總結 說在前面 整天說SQL優化,SQL優化,到底怎麼才算是SQL優化呢,下面從百度總結了一些關於Oracle裡常用的一些有效的優化方法。僅供參考,文章內容來源於網路。 34條優化規則 (1)選擇最有效率的表名順序(只在基於規則的優

oracle11gSQL優化SQL TUNING新特性之Adaptive Cursor Sharing (ACS)

ise cut info xtend 優化器 指標 語法 oracl 綁定 1. ACS簡介 Oracle Database 11g提供了Adaptive Cursor Sharing (ACS)功能,以克服以往不該共享的遊標被共享的可能性。ACS使用兩個新指標:se

sql order by與索引之間的關係where條件出現欄位才有效

ORDER BY 通常會有兩種實現方法,一個是利用有序索引自動實現,也就是說利用有序索引的有序性就不再另做排序操作了。另一個是把結果選好之後再排序。 用有序索引這種,當然是最快的,不過有一些限制條件,來看下面的測試。 測試資料:student表有兩個欄位id ,sid ,id

oracle sql 語句where條件 1=1 是什麼意思

是為了後面附加and ...方便程式邏輯處理用的, 要不然你就得稍微複雜一點兒處理: 有where條件。。。 沒有where條件。。。 1=1 是永恆成立的,意思無條件的,也就是說在SQL語句裡有沒有這個1=1都可以。 這個1=1常用於應用程式根據使用者選擇項的不

where 條件 使用 instr 替代 in

select  * from  expense  ee  where ee.pro_ype = processType  and ee.cost_type in ( SELECT tt.value FROM t_enum tt where  tt.enum_name =

SQL優化SQL TUNING之10分鐘完畢億級數據量性能優化SQL調優

font 一個 進一步 結束 語句 pop 技術分享 處理 fill 前幾天。一個用戶研發QQ找我,例如以下: 自由的海豚。 16:12:01 島主,我的一條SQL查不出來結果,能幫我看看不? 蘭花島主 16:12:10 多久不出結果? 自由的海豚 16:12:17

sql優化oracle- 第二部分 常用sql用法和註意事項

個數 its 用法 記錄 減少 合並 .com 語句 一個 第二部分 常用sql用法和註意事項 1. exists 和 in 2. union 和 union all

sql優化oracle- 第三部分  sql優化總結

mit 設計 tinc 重復 tin spa 替代 嵌套 多個 第三部分 sql優化總結 1. 優化一般原則 2. 具體註意事項 1. SQL優化一般性原則  1)目標:減少服務器資源消耗(主要是磁盤IO)  2)設計:    1. 盡量依

LeetCode 562. Longest Line of Consecutive One in Matrix在矩陣最長的連續1$

find ive col discus hint 分開 arr public 標簽 Given a 01 matrix M, find the longest line of consecutive one in the matrix. The line could be

SQL優化SQL TUNING之10分鐘完成億級數據量性能優化SQL調優

rom 分享 分鐘 jsb tab tex sql調優 emf group 前幾天,一個用戶研發QQ找我,如下: 自由的海豚。 16:12:01 島主,我的一條SQL查不出來結果,能幫我看看不? 蘭花島主 16:12:10 多久不出結果? 自由的海豚 16:

Mybatis動態SQLwhere元素、set元素、if元素

result 多條 pre users 子元素 per 條件 span fig Mybatis動態SQL(where元素、set元素、if元素) - where 元素只會在至少有一個子元素的條件返回 SQL 子句的情況下才去插入“WHERE”子句。而且,若語句的開頭為“AN

sql優化---- 索引(一)

組合 name 索引 pre 語法 時間 RoCE 搜索功能 jpg --- title: 不懂SQL優化?那你就OUT了(二) -- 索引(一) date: 2018-10-27 categories: 數據庫優化 --- 要想讓一個較慢的select ...

索引原理和SQL優化轉載待整理

索引的本質 MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取資料的資料結構。提取句子主幹,就可以得到索引的本質:索引是資料結構。 我們知道,資料庫查詢是資料庫的最主要功能之一。我們都希望查詢資料的速度能儘可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行優化。最

4.SQL優化Where語句

1 優化Where語句 以下優化適用於使用SELECT語句,但相同的優化適用於DELETE和UPDATE語句中的WHERE子句。 為了優化查詢,有時我們可能考慮犧牲程式可讀性,但是MySQL在生成執行計劃時會對SQL進行改寫,所以我們不需要過度改寫,儘量保證可讀性,只有在效能無法滿足

sql優化--索引設計的原則

--- title: 不懂SQL優化?那你就OUT了(三) -- 索引(二) -- 索引的設計原則 date: 2018-11-03 categories: 資料庫優化 ---     上一遍部落格我們主要介紹了什麼是索引,為什麼要使用索引,索引的好處和如何建立索

SQL優化索引長度

    在SQL執行計劃中,key_len 表示索引長度,經常用於判斷複合索引是否被完全使用。先說結論: 在utf8編碼方式下,一個字元佔3個位元組。 如果索引欄位可以為null,MySQL會使用1個位元組標識。 如果索引欄位的型別長度可變,MySQL會使用2個位元組標

MySQL之新SQL優化非同步執行

背景 本次SQL優化是針對javaweb中的表格查詢做的。 部分網路架構圖 業務簡單說明 N個機臺將業務資料傳送至伺服器,伺服器程式將資料入庫至MySQL資料庫。伺服器中的javaweb程式將資料展示到網頁上供使用者檢視。 原資料庫設計 windows單機主從

【MySql】Sql優化——影響效能的因素

一、前言 在上一篇部落格中,小編向大家簡單介紹了一下Mysql執行的流程:客戶端傳送一條查詢給資料庫伺服器,伺服器先進行許可權檢測,然後在快取中查詢,如果命中了快取,就立即返回儲存在快取中的結果,如果沒有,就再經過解析器解析,前處理器進行預處理,優化器優化,得到