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
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)選擇最有效率的表名順序(只在基於規則的優
oracle11g中SQL優化(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動態SQL(where元素、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執行的流程:客戶端傳送一條查詢給資料庫伺服器,伺服器先進行許可權檢測,然後在快取中查詢,如果命中了快取,就立即返回儲存在快取中的結果,如果沒有,就再經過解析器解析,前處理器進行預處理,優化器優化,得到