欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      .Net+SQL Server企業(yè)應(yīng)用性能優(yōu)化筆記3——SQL查詢語句

      時間:2019-05-13 16:14:34下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《.Net+SQL Server企業(yè)應(yīng)用性能優(yōu)化筆記3——SQL查詢語句》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《.Net+SQL Server企業(yè)應(yīng)用性能優(yōu)化筆記3——SQL查詢語句》。

      第一篇:.Net+SQL Server企業(yè)應(yīng)用性能優(yōu)化筆記3——SQL查詢語句

      在上一篇文章中我們使用了幾種方法來確定瓶頸,找到瓶頸,下面再回顧一下:

      LoadRunner壓力測試+Windows計(jì)數(shù)器,這種方法主要是找出大概的性能問題是在哪臺服務(wù)器,主要是哪個資源緊張。

      ? ANTS Profiler+SQL Server Profiler,這兩個工具的完美搭配可以準(zhǔn)確的定位性能是出在哪個函數(shù),哪個SQL語句上。?

      如果性能問題是出在程序上,那么就要根據(jù)業(yè)務(wù)對程序中的函數(shù)進(jìn)行調(diào)整,可能是函數(shù)中的寫法有問題,算法有問題,這種調(diào)整如果不能解決問題的話,那么 就要從架構(gòu)上進(jìn)行考慮,我們是不是應(yīng)該使用這種技術(shù),有沒有替代的方案來實(shí)現(xiàn)同樣的業(yè)務(wù)功能?舉個簡單的例子,假設(shè)經(jīng)過跟蹤發(fā)現(xiàn),一個負(fù)責(zé)生成圖表的函數(shù) 存在性能問題,尤其是在壓力測試情況下性能問題尤為嚴(yán)重。原來的圖表生成是完全基于GDI+在Web服務(wù)器上根據(jù)數(shù)據(jù)進(jìn)行復(fù)雜的繪圖,然后將繪出的圖片保 存在磁盤上,然后在HTML中添加Img標(biāo)簽來引用圖片的地址。現(xiàn)在使用GDI+會消耗大量內(nèi)存和CPU,而算法上也沒有太大的問題,那么這種情況下我們 就需要考慮修改架構(gòu),不使用GDI+ 繪圖的方式,或者是使用異步繪圖的方式。既然繪圖會消耗大量的服務(wù)器資源,那么一種解決辦法就是將繪圖的操作從服務(wù)器轉(zhuǎn)移到客戶端。使用 SilverLight技術(shù),在用戶打開網(wǎng)頁是只是下載了一個SilverLight文件,該文件負(fù)責(zé)調(diào)用Web服務(wù)器的Web服務(wù),將繪圖所需的數(shù)據(jù)獲 取下來,然后在客戶端繪圖展現(xiàn)出來。這樣服務(wù)器只提供WebService的數(shù)據(jù)訪問接口,不需要做繪圖操作。

      .net上的優(yōu)化我暫時不表,今天主要講數(shù)據(jù)庫的優(yōu)化。使用ANTS Profiler+SQL Server Profiler我們可以精確定位某個業(yè)務(wù)操作對應(yīng)的數(shù)據(jù)庫腳本或者存儲過程。ANTS Profiler告訴我們一個方法在調(diào)用的時候花了10秒的時間,那么我們就可以使用VS打開源代碼,找到該放入,然后找到對應(yīng)調(diào)用的存儲過程,這里也許 一個方法里面調(diào)用了多個數(shù)據(jù)層方法,調(diào)用了多個存儲過程。將調(diào)用的這些存儲過程記下了,然后在SQL Server Provider的跟蹤文件里面去找調(diào)用該存儲過程花費(fèi)的Duration。

      據(jù)的時間

      一般企業(yè)應(yīng)用或小型應(yīng)用中數(shù)據(jù)庫服務(wù)器和Web服務(wù)器要不是就在同一個機(jī)房,同一個局域網(wǎng),或者干脆是同一臺機(jī)器,這種情況下網(wǎng)絡(luò)傳輸速度是很快 的,所以我們不考慮網(wǎng)絡(luò)傳送上面的時間。那么就得出:的存儲過程的Duration)

      代碼中的時間得到了,SQL Server中的時間(也就是Duration字段)得到了,那么就可以判斷出打開該頁面各個服務(wù)器所花費(fèi)的時間,從而找到我們要優(yōu)化的方向,是存儲過程 還是C#代碼。如果是存儲過程,那么通過查詢SQL Server Profiler中內(nèi)容可以找到具體是哪一個存儲過程消耗的時間最長。

      “射人先射馬,擒賊先擒王?!倍鄠€存儲過程被調(diào)用,如果性能出在數(shù)據(jù)庫服務(wù)器上,那么進(jìn)行性能優(yōu)化時首先要調(diào)優(yōu)的是最大Duration最大的存儲 過程,另外還有就是Reads很大的存儲過程。如果Duration很大但是Reads和Writes都不算特別大,那么有可能是以下原因:

      1.這個存儲過程相關(guān)的資源正在被其他事務(wù)占用,也就是說該存儲過程被阻塞所以才花了那么多時間。這種情況只需要把該存儲過程提出,多執(zhí)行幾 次,看是不是仍然Duration很大但Reads不大。

      2.存儲過程本身很復(fù)雜,里面的T-SQL語句就是五六百行,編譯出的執(zhí)行計(jì)劃也是一堆,里面進(jìn)行了大量的邏輯判斷、大量函數(shù)的調(diào)用,這種情 況下進(jìn)行調(diào)優(yōu)就比較痛苦了。實(shí)際上這次我調(diào)優(yōu)的這個項(xiàng)目就是如此,抓取出來的存儲過程盡是復(fù)雜的邏輯,少則兩三百行代碼,多則五六百行,里面還有大量的用 戶定義函數(shù)的調(diào)用。對于這種存儲過程,我接下來會專門寫篇博客介紹下我們這個項(xiàng)目是如何調(diào)優(yōu)的。

      3.程序讀取的數(shù)據(jù)不多,但是需要對數(shù)據(jù)進(jìn)行大量的運(yùn)算。哈希聯(lián)接、聚合函數(shù)、DISTINCT、UNION等都是比較耗CPU的。如果是這 種情況那就看能不能建立索引或者改寫法進(jìn)行調(diào)優(yōu)。

      前面說的是Duration大而Reads小的情況,當(dāng)然更常見的情況是Duration和Reads都很大。那么我們就將主要精力集中在如何減小 Reads上。造成Reads很多的原因大概有以下幾種:

      1.沒有建立相應(yīng)的索引。對表t1進(jìn)行查詢,條件是where c2=abc返回c1,c2,c3三個字段,那么這種情況下如果沒有對c2建立非聚集索引(c1是主鍵,建立了聚集索引),那么這個查詢將會進(jìn)行“聚集索 引掃描”,本來可能只查出幾條記錄的,結(jié)果要把表的所有記錄都掃描一篇,自然Reads就高了。解決辦法就是建立相應(yīng)的索引,比如這里只需要對c2字段建 立非聚集索引,然后將c3字段作為包行列就行了。如果只是最c2字段建立非聚集索引,那么前面說到的查找在進(jìn)行了“非聚集索引查找”后還會進(jìn)行“鍵查找” 來找到c3列的值,所以要建立的正確的索引才行。

      2.不符合SARG原則。查詢?nèi)绻环蟂ARG原則,那么即使建立了索引也沒法使用。SARG就是查詢參數(shù)的意思,具體怎么寫才符合 SARG,大家可以百度,已經(jīng)有很多相關(guān)文章了,我就不累述。

      3.涉及的業(yè)務(wù)數(shù)據(jù)量大。也就是說即使建立了正確的索引,查詢也符合SARG使用到了該索引,但是由于涉及的數(shù)據(jù)量太大了,所以Reads仍 然很大。這種情況就不能再從索引和查詢?nèi)胧郑荒軓臄?shù)據(jù)庫的設(shè)計(jì)入手。是否能夠增加適當(dāng)?shù)娜哂嘧侄?,對?shù)據(jù)庫進(jìn)行反范式化,或者如果數(shù)據(jù)的實(shí)時性要

      求不 高的話則可以建立中間匯總表,使用SQL作業(yè)來維護(hù)這個中間匯總表,查詢的時候只查詢該中間匯總表即可?;蛘呤欠窨梢越⑺饕晥D或者計(jì)算列,然后在計(jì)算 列中建立索引的方式進(jìn)行一個預(yù)運(yùn)算,減小實(shí)際查詢時涉及的數(shù)據(jù)量。

      4.使用了不當(dāng)?shù)囊晥D。如果對視圖的定義很復(fù)雜,涉及的表很多,在查詢的時候使用了該視圖,但是實(shí)際上只用到了視圖中的一張或兩張表,對視圖 的查詢會造成系統(tǒng)根據(jù)視圖定義查詢其他與該查詢不相關(guān)的表。所以在使用視圖的時候一定要知道視圖的定義,不用貪圖一時的方便而隨便使用視圖。

      5.不正確的使用了用戶定義函數(shù)。一個存儲過程中幾百行代碼,出于編寫方便,大量的調(diào)用了一個用戶定義表值函數(shù),而該函數(shù)是進(jìn)行了復(fù)雜的查詢 和運(yùn)算才返回結(jié)果的。如果數(shù)次或者數(shù)十次的調(diào)用該用戶定義表值函數(shù),那么就會進(jìn)行很多這種復(fù)雜的查詢和運(yùn)算,自然Reads也就很大了。解決辦法是盡量減 少對這種復(fù)制函數(shù)的調(diào)用,比如一次調(diào)用后就將解決保存在表變量或臨時表中,接下來再使用的話就使用該表變量或臨時表即可。

      如果Duration并不大,但是Reads卻很大的查詢?nèi)匀恍枰枰M(jìn)行優(yōu)化。雖然表現(xiàn)出來消耗的時間并不大,但是由于Reads很多,那么說明 要進(jìn)行大量的IO,在高并發(fā)的情況下大量的IO處理不過來會加重磁盤的負(fù)擔(dān),造成CPU占用率上升,性能降低,這時其Duration就會變大。關(guān)于 Duration不大但是Reads很大的情況仍然是前面說到的幾點(diǎn)情況,建立相關(guān)索引、修改查詢語句等便可解決。

      第二篇:SQL語句性能優(yōu)化

      我也做了很長時間醫(yī)療軟件,也寫過不少sql優(yōu)化,沒有詳細(xì)記錄下來,個人感覺下面轉(zhuǎn)載的更符合醫(yī)院醫(yī)療軟件實(shí)際業(yè)務(wù),很認(rèn)可大部分所寫的原則,固轉(zhuǎn)載過來,以作借鑒。軟件的根本還是在于更細(xì)更精,在于從客戶的實(shí)際使用考慮問題。

      性能優(yōu)化原則1:永遠(yuǎn)避免困境

      利用緩存把字典數(shù)據(jù)取到中間服務(wù)器或是客戶端替代直接sql查詢,如,門診醫(yī)生站把字典下載到客戶端,減少執(zhí)行次數(shù)。

      一次性取數(shù)據(jù)到客戶端,然后再逐條處理,而不是分次取數(shù)據(jù),處理好一條數(shù)據(jù)再取下一條再處理。例:門診收費(fèi)取hjcfmxk例子,原來是一張?zhí)幏綏l明細(xì)都查詢一次,查詢后再處理,現(xiàn)改為一次把所有明細(xì)都取過來,然后一條條處理

      盡量減少光標(biāo),看能不能用臨時表

      性能優(yōu)化原則2:kiss原則

      對于where 條件中的左邊可以利用索引的字段Keep it simple stupid,左邊盡量避免用函數(shù)(substring,isnull,upper,lower),參加計(jì)算+,-*/

      例子1:select * from ZY_BRFYMXK where substring(zxrq,1,8)='20081212‘

      select * from ZY_BRFYMXK where zxrq between '2008121200' and '2008121224' 例子2:

      select * from zy_detail_charge where SUBSTRING(patient_id,1,10)=

      substring('000005090600',1,10)這句耗時30秒以上

      select * from zy_detail_charge where patient_id like substring('000005090600',1,10)+'%' 這句耗時2秒以內(nèi)

      性能優(yōu)化原則3:盡可能利用到索引

      例:select * from ZY_BRFYMXK a(nolock),VW_LSYZK b(nolock)where a.syxh=3 and a.yzxh=b.xh and a.fylb=0

      select * from ZY_BRFYMXK a(nolock),VW_LSYZK b(nolock)where a.syxh=3 and a.yzxh=b.xh and a.fylb=0 and b.syxh=3

      性能優(yōu)化原則4:or,避而遠(yuǎn)之

      對于索引字段盡力避免用or,普通字段可以用or,解決要么分解成多個sql,要么用業(yè)務(wù)規(guī)則避免,例:declare @rq1 ut_rq16,@syxh ut_syxh

      select @rq1='20081201'

      select @syxh=157

      性能優(yōu)化原則5:避免大批量數(shù)據(jù)取到前臺

      例: select * from ZY_BRSYK cyrq between ‘20080901’ and ‘20081201‘,對于大醫(yī)院每天100多人,90天是9000條數(shù)據(jù)

      性能優(yōu)化原則6:事務(wù),盡可能的短吧

      所有計(jì)算、對臨時表的更新都應(yīng)但放在事務(wù)外,事務(wù)中最好只有更新和插入正式表操作.因?yàn)槭聞?wù)中產(chǎn)生的鎖只有在commit tran是才會釋放。

      性能優(yōu)化原則7:熱表,留在最后吧

      熱表是頻繁調(diào)用的表。如:sf_mzcfk,zy_brfymxk,bq_fyqqk.對于熱表盡量放在事務(wù)最后:這樣鎖的時間短。大家都堅(jiān)持這樣,死鎖的可能性就小。如果都是熱表各個存儲過程更新表的順序應(yīng)當(dāng)一樣這樣可以避免死鎖

      性能優(yōu)化原則8:創(chuàng)建臨時表一定要避免在事務(wù)中作

      如create #tempXX(…)

      Select * into #tempXX from …

      因?yàn)閯?chuàng)建臨時表會鎖tempdb的系統(tǒng)表

      例:生成#temp1放在事務(wù)內(nèi)外,用sp_lock2 ‘’觀察結(jié)果

      if object_id('tempdb..#temp1','U')is not null

      drop table #temp1

      begin tran

      select * into #temp1 from ZY_BRSYK where ryrq>'20080901‘

      select * from #temp1

      waitfor delay '00:00:10'

      commit

      性能優(yōu)化原則9:大的報(bào)表查詢避免與正常業(yè)務(wù)碰撞

      如果沒有查詢服務(wù)器,那要在存儲過程中限制不能操作加上如:

      declare @rq1 ut_rq16,@rq2 ut_rq16,@now ut_rq16

      select @rq1=convert(varchar(8),getdate(),112)+'08:00:00'

      select @rq1=convert(varchar(8),getdate(),112)+'11:30:00'

      select @now=convert(char(8),getdate(),112)+convert(char(8),getdate(),8)

      if @now>@rq1 and @now<@rq2

      begin

      select '上午繁忙時間段不能作此查詢'

      return

      end

      性能優(yōu)化原則10:存儲過程避免大的if…else…

      這個常出項(xiàng)在業(yè)務(wù)相同表不同的存儲過程中,因?yàn)檫@樣常到if …else …原來醫(yī)技接口中很多這種存儲過程,當(dāng)時把門診住院業(yè)務(wù)放在一個存儲過程中。這樣最大的問題是sql server會根據(jù)sql語句來compile存儲,這個過程會生成優(yōu)化計(jì)劃,決定用那個索引。如果存儲過程用到門診表compile一下,到用到住院表是發(fā)現(xiàn)不對,又會compile一下,這樣不停compile.compile很號時間要1-2秒,而且一個存儲過成在compile是,所有調(diào)用這個存儲過程的進(jìn)程都要在排隊(duì)等候,因?yàn)樗麜?dú)占鎖這個存儲過程

      例:usp_yjjk_getwzxxm_old.sql,后改為:

      usp_yjjk_getwzxxm.sql, usp_yjjk_getwzxxm_mz.sql,usp_yjjk_getwzxxm_zy.sql

      性能優(yōu)化原則11:進(jìn)攻是最好的防守

      在普通編程語句對于數(shù)據(jù)校驗(yàn)總是用防守辦法先判斷,后再作相應(yīng)處理。而在sql中先處理再判斷性能會好很多。

      --更新藥品庫存。

      If exists(select 1 from YK_YKZKC WHERE idm=100 and kcsl>50)

      begin

      update YK_YKZKC set kcsl=kcsl-50 where idm=100

      End

      Else begin

      rollback tran

      Select ‘F庫存不夠’

      return

      end

      --改為

      update YK_YKZKC set kcsl=kcsl-50 where idm=100 and kcsl>50

      If @@rowcount<=0

      Begin

      Rollbakc tran

      Select ‘F庫存不夠’

      end

      --取未執(zhí)行的醫(yī)技項(xiàng)目,日表沒有數(shù)據(jù)就到年表中查找

      if exists(select a.* from SF_MZCFK a(nolock),SF_CFMXK b(nolock)

      begin

      select a.* into #temp1 from SF_MZCFK a(nolock),SF_CFMXK b(nolock)

      end

      else begin

      select a.* into #temp1 from SF_NMZCFK a(nolock),SF_NCFMXK b(nolock)

      end

      --改為

      Insert into #temp1 select a.*

      from SF_MZCFK a(nolock),SF_CFMXK b(nolock)

      If @@rowcount=0

      Begin

      Insert into #temp1 select a.*

      from SF_NMZCFK a(nolock),SF_NCFMXK b(nolock)

      end

      性能優(yōu)化原則12:trig最后的手段

      Trig(觸發(fā)器)的處理的處理機(jī)制是滿足條件時就會在源語句后面加上trig中的代碼進(jìn)行執(zhí)行。

      它有兩個致命的弊端:(1)不清楚有trig的人會對于執(zhí)行結(jié)果感到迷惑。如常有在插入一張表如果主鍵是indentity的值常取用select @@identity。但如是有trig,tring中有表插入操作,這時的@@identity可能就不是想要的值。(2)trig會束縛選擇。如:有一套單據(jù)主表和明細(xì)表,當(dāng)明細(xì)表的金額更新時,要同步主表的金額,當(dāng)程序是一條條更新明細(xì)時用trig的作法是每當(dāng)更新一條明細(xì)記錄時都算一處所有明細(xì)表的總金額,再去更新主表的金額。這樣有多少條明細(xì)就要算多少次,好的作法是不要trig,直接在sql語句中明細(xì)更新完明后,一次性算出總金額每條單據(jù)的總金額,再更新主表的金額。

      對于trig如果有其他手段就一定要避免用trig.性能優(yōu)化原則13:用戶說好才是真的好

      1)有時sql語句性能難以優(yōu)化,但用戶對于系統(tǒng)響應(yīng)速度還是不滿意。這時可以從業(yè)務(wù)分析處理。

      如:我們退費(fèi)模塊錄入發(fā)票號原來是用fph like ‘XXX%’。用戶報(bào)怨慢,后來改為先用fph=‘XXX’來查,如查不到再fph like ‘XXX%’。這樣在絕大部情況下速度都非常快,同時也滿足小部分情況下模糊查詢的需求。

      如:我們的程序要查日表和年表。如果通過日表union表視圖去查會非常慢,性能也難以優(yōu)化。程序改為普通情況下不查年表,用戶勾上年表標(biāo)志時才查年表。

      (2)查詢統(tǒng)計(jì)很多數(shù)據(jù)時間比較長,就以查詢完一部分?jǐn)?shù)據(jù)后可以顯示這部分?jǐn)?shù)據(jù)或是用提示,這樣用戶清楚系統(tǒng)在作事情也知道大概進(jìn)度。這樣情緒上會好很多。

      (3)查詢模塊常有一進(jìn)入時也默認(rèn)一個查詢,如果性能好,查詢又合用戶心意,這種設(shè)計(jì)非常好,如果性能不好,那就不是好的設(shè)計(jì)。用戶對于進(jìn)入都困難的模塊是沒有好感的。

      (4)有戶的耐心與查詢出的記錄成正比。用戶痛恨等待很久卻沒有查詢出記錄。

      對于非常慢的查詢,如果有些子查詢非??炜梢韵茸鬟@樣查詢以避免查詢很久卻沒有數(shù)據(jù)出來的情況。如:按病歷號查在院病人所有費(fèi)有明細(xì),可以先查一下這個病歷是不是有對應(yīng)病人。

      實(shí)戰(zhàn)技巧1:用exists、in代替distinct

      Distinct實(shí)際上是先收集再刪除這樣兩步都耗資源。

      Exists,in會隱式過濾掉重復(fù)的記錄

      例查自2009年以來有金額大于100的藥品的病人

      select distinct a.blh,a.hzxm from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock)where a.patid=b.patid and b.syxh=c.syxh and c.zxrq>'2009' and c.zje>100--改為

      select a.blh,a.hzxm from ZY_BRXXK a where exists(select 1 from ZY_BRSYK

      b(nolock),ZY_BRFYMXK c(nolock)where a.patid=b.patid and b.syxh=c.syxh and

      c.zxrq>'2009'and c.zje>100)

      實(shí)戰(zhàn)技巧2:縮短union

      select …from A,B,C,D,E1

      where(E1的條件)

      and(其他表聯(lián)接條件)

      union

      select …from A,B,C,D,E2

      where(E2的條件)

      and(其他表接接條件)

      改為

      select …from A,B,C,D,(select...from E1where(E1條件)

      union

      select …from E2where(E2條件))E where(其他條件)

      當(dāng)涉及ABCD表部分耗資源而E1,E2不耗資源時是這樣,如果反過來則改后的性能不一定好。查2009年4月后入院的在院病人在2905病區(qū)發(fā)生的所有費(fèi)用明細(xì)

      select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw

      select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw

      from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),YK_YPCDMLK d where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.idm=d.idm

      union all

      select a.hzxm,b.cyrq,d.name,d.xmgg,c.ypsl/c.dwxs ypsl, c.ypdw

      from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),YY_SFXXMK d where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.ypdm=d.id and c.idm=0

      --改為

      select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw

      from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),(select ypmc,ypgg,ypdm,idm idm from YK_YPCDMLK union select name,xmgg,id,0 from YY_SFXXMK)d

      where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.idm=d.idm and c.ypdm=d.ypdm

      實(shí)戰(zhàn)技巧3:合并sql

      把表和where條件類似的兩個或是多個sql合并為一個sql.--查2009年以后的普通、急診、專家掛號人數(shù)

      declare @ptghs int,@jzghs int,@zjghs int

      select @ptghs=0,@jzghs=0,@zjghs=0

      select @ptghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=0

      select @jzghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=1

      select @zjghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=2

      select @ptghs,@jzghs,@zjghs

      --改為

      select @ptghs=0,@jzghs=0,@zjghs=0

      select @ptghs=sum(case when ghlb=0 then 1 else 0 end),@jzghs=sum(case when ghlb=1 then 1 else 0 end), @zjghs=sum(case when ghlb=2 then 1 else 0 end)

      from GH_GHZDK where ghrq>'2009'

      select @ptghs,@jzghs,@zjghs

      實(shí)戰(zhàn)技巧4:去掉游標(biāo)

      把游標(biāo)當(dāng)作編程語言的for,do---while的方式,很多情況下都可以去掉,如果光標(biāo)中間sql語句只有一條一般都是可以去掉光標(biāo)改為一句sql。

      --查當(dāng)天出院出院日期在2009年4月1到9日間病人的zfdj,zfje置為0

      declare @syxh ut_syxh

      declare cur1 cursor for select syxh from ZY_BRSYK where cyrq>='20090401' and cyrq<'20090410'

      open cur1

      fetch cur1 into @syxh

      while @@fetch_status=0

      begin

      fetch cur1 into @syxh

      end

      close cur1

      deallocate cur1

      --改為

      update ZY_BRFYMXK set zfdj=0,zfje=0

      from ZY_BRFYMXK a,ZY_BRSYK b

      where a.syxh=b.syxh and b.cyrq>='20090401' and b.cyrq<'20090410'

      實(shí)戰(zhàn)技巧5:取代count

      利用內(nèi)部函數(shù)代替

      declare @count int

      select * into #tmep1 from ZY_BRFYMXK WHERE zxrq>'200901'

      select @count=@@rowcount—可以得到count值

      select @count

      select @count=count(*)from #tmep1—可以被取代

      select @count

      利用exists而不count判斷有沒有記錄

      declare @count int

      Select @count=count(1)from ZY_BRFYMXK WHERE zxrq>'2009‘

      If @count>0 … else ….--改為

      If exists(Select 1 from ZY_BRFYMXK WHERE zxrq>'2009’)… else ….

      第三篇:SQL查詢語句學(xué)習(xí)筆記

      問題描述:

      為管理崗位業(yè)務(wù)培訓(xùn)信息,建立3個表:

      S(SID,SNAME,SDEPT,SEX,AGE)SID,SNAME,SDEPT,SEX,AGE 分別代表學(xué)號、學(xué)員姓名、所屬部門、學(xué)員性別、學(xué)員年齡

      C(CID,CNAME)CID,CNAME 分別代表課程編號、課程名稱

      SC(SID,CID,GRADE)SID,CID,GRADE 分別代表學(xué)號、所選修的課程編號、學(xué)習(xí)成績

      表結(jié)構(gòu)與數(shù)據(jù)見Data4SqlTest1.sql

      要求實(shí)現(xiàn)如下5個處理:

      1.使用標(biāo)準(zhǔn)SQL嵌套語句查詢選修課程名稱為“英語”的學(xué)員學(xué)號和姓名

      2.使用標(biāo)準(zhǔn)SQL Join語句查詢選修課程名稱為“英語”的學(xué)員學(xué)號和姓名

      3.使用標(biāo)準(zhǔn)SQL語句查詢不選修“數(shù)學(xué)”課程的學(xué)員姓名和所屬單位

      4.使用標(biāo)準(zhǔn)SQL嵌套語句查詢選修全部課程的學(xué)員姓名和所屬單位

      5.查詢選修了課程的學(xué)員人數(shù)

      6.查詢選修課程超過3門的學(xué)員學(xué)號和所屬單位

      1.使用標(biāo)準(zhǔn)SQL嵌套語句查詢選修課程名稱為“英語”的學(xué)員學(xué)號和姓名 Java代碼

      1.SELECT SNAME,SDEPT FROM S

      2.WHERE SID IN(3.SELECT SID FROM C,SC

      4.WHERE C.CID=SC.CID

      5.AND CNAME='英語')

      2.使用標(biāo)準(zhǔn)SQL Join語句查詢選修課程名稱為“英語”的學(xué)員學(xué)號和姓名 Java代碼

      1.SELECT SNAME,SDEPT FROM S

      2.JOIN SC ON S.SID=SC.SID JOIN C ON C.CID=SC.CID

      3.WHERE CNAME='英語'

      3.使用標(biāo)準(zhǔn)SQL語句查詢不選修“數(shù)學(xué)”課程的學(xué)員姓名和所屬單位 Java代碼

      1.select SNAME,SDEPT

      2.from S

      3.where SID not in(4.select SC.SID

      5.from SC

      6.right join(select S.SID,C.CID from S join C)as T on SC.SID=T.SID

      and SC.CID=T.CID join C on T.CID=C.CID

      7.where C.CNAME='數(shù)學(xué)' and SC.SID is not null

      8.)

      或者是:

      Java代碼

      1.SELECT SNAME,SDEPT FROM S

      2.WHERE SID NOT IN(3.SELECT SID FROM SC

      4.WHERE CID IN(SELECT CID FROM C WHERE CNAME='數(shù)學(xué)'))

      4.使用標(biāo)準(zhǔn)SQL嵌套語句查詢選修全部課程的學(xué)員姓名和所屬單位 Java代碼

      1.select SNAME,SDEPT

      2.from S

      3.where SID in

      4.(select S.SID

      5.from S

      6.inner join SC on S.SID=SC.SID

      7.group by S.SID

      8.having count(CID)=(select count(1)from C)

      9.)

      5.查詢選修了課程的學(xué)員人數(shù)

      Java代碼

      1.SELECT 學(xué)員人數(shù)=COUNT(DISTINCT(SID))FROM SC

      6.查詢選修課程超過3門的學(xué)員學(xué)號和所屬單位

      Java代碼

      1.SELECT SNAME,SDEPT FROM S

      2.WHERE SID IN(3.SELECT SID FROM SC

      4.GROUP BY SID

      5.HAVING COUNT(DISTINCT(CID))>3)

      下載.Net+SQL Server企業(yè)應(yīng)用性能優(yōu)化筆記3——SQL查詢語句word格式文檔
      下載.Net+SQL Server企業(yè)應(yīng)用性能優(yōu)化筆記3——SQL查詢語句.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦