優化SQL Server數據庫查詢方法(2)

發表于:2014-03-10來源:IT專家網作者:不詳點擊數: 標簽:SQL Server
每個數據庫都有一個全局當前時間戳值:@@DBTS。每次以任何方式更改帶有timestamp 列的行時,SQL Server 先在時間戳列中存儲當前的 @@DBTS 值,然后增加 @@DBT

  每個數據庫都有一個全局當前時間戳值:@@DBTS。每次以任何方式更改帶有timestamp 列的行時,SQL Server 先在時間戳列中存儲當前的 @@DBTS 值,然后增加 @@DBTS 的值。如果某個表具有timestamp 列,則時間戳會被記到行級。服務器就可以比較某行的當前時間戳值和上次提取時所存儲的時間戳值,從而確定該行是否已更新。服務器不必比較所有列的值,只需比較 timestamp 列即可。如果應用程序對沒有timestamp 列的表要求基于行版本控制的樂觀并發,則游標默認為基于數值的樂觀并發控制。SCROLL LOCKS 這個選項實現悲觀并發控制。在悲觀并發控制中,在把數據庫的行讀入游標結果集時,應用程序將試圖鎖定數據庫行。在使用服務器游標時,將行讀入游標時會在其上放置一個更新鎖。如果在事務內打開游標,則該事務更新鎖將一直保持到事務被提交或回滾;當提取下一行時,將除去游標鎖。如果在事務外打開游標,則提取下一行時,鎖就被丟棄。

  因此,每當用戶需要完全的悲觀并發控制時,游標都應在事務內打開。更新鎖將阻止任何其它任務獲取更新鎖或排它鎖,從而阻止其它任務更新該行。然而,更新鎖并不阻止共享鎖,所以它不會阻止其它任務讀取行,除非第二個任務也在要求帶更新鎖的讀取。滾動鎖根據在游標定義的語句中指定的鎖提示,這些游標并發選項可以生成滾動鎖。滾動鎖在提取時在每行上獲取,并保持到下次提取或者游標關閉,以先發生者為準。下次提取時,服務器為新提取中的行獲取滾動鎖,并釋放上次提取中行的滾動鎖。滾動鎖獨立于事務鎖,并可以保持到一個提交或回滾操作之后。如果提交時關閉游標的選項為關,則COMMIT語句并不關閉任何打開的游標,而且滾動鎖被保留到提交之后,以維護對所提取數據的隔離。所獲取滾動鎖的類型取決于游標并發選項和游標 語句中的鎖提示。鎖提示 只讀樂觀數值指定 NOLOCK 提示將使指定了該提示的表在游標內是只讀的。

  16、用Profiler來跟蹤查詢,得到查詢所需的時間,找出SQL的問題所在;用索引優化器優化索引17、注意UNion和UNion all 的區別。UNION all好18、注意使用DISTINCT,在沒有必要時不要用,它同UNION一樣會使查詢變慢。重復的記錄在查詢里是沒有問題的19、查詢時不要返回不需要的行、列

  20、用sp_configure ''query governcost limit''或者SET QUERY_GOVERNOR_COST_LIMIT來限制查詢消耗的資源。當評估查詢消耗的資源超出限制時,服務器自動取消查詢,在查詢之前就扼殺掉。SET LOCKTIME設置鎖的時間21、用top 100 / 10 Percent 來限制用戶返回的行數或者SET ROWCOUNT來限制操作的行22、在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", "LIKE ''%500''",因為他們不走索引全是表掃描。也不要在WHere字句中的列名加函數,如Convert,substring等,如果必須用函數的時候,創建計算列再創建索引來替代。還可以變通寫法:WHERE SUBSTRING(firstname,1,1) = ''m''改為WHERE firstname like ''m%''(索引掃描),一定要將函數和列名分開。并且索引不能建得太多和太大。NOT IN會多次掃描表,使用EXISTS、NOT EXISTS ,IN , LEFT OUTER 來替代,特別是左連接,而Exists比IN更快,最慢的是NOT操作。如果列的值含有空,以前它的索引不起作用,現在2000的優化器能夠處理了。相同 的是IS NULL,“NOT", "NOT EXISTS", "NOT IN"能優化她,而”<>”等還是不能優化,用不到索引。

  23、使用Query Analyzer,查看SQL語句的查詢計劃和評估分析是否是優化的SQL。一般的20%的代碼占據了80%的資源,我們優化的重點是這些慢的地方。

  24、如果使用了IN或者OR等時發現查詢沒有走索引,使用顯示申明指定索引:* FROM PersonMember (INDEX = IX_Title) WHERE processid IN (‘男’,‘女’)25、將需要查詢的結果預先計算好放在表中,查詢的時候再SELECT。這在SQL7.0以前是最重要的手段。例如醫院的住院費計算。

  26、MIN()和MAX()能使用到合適的索引。

  27、數據庫有一個原則是代碼離數據越近越好,所以優先選擇Default,依次為Rules、Triggers、 Constraint(約束如外健主健CheckUNIQUE……,數據類型的最大長度等等都是約束),Procedure.這樣不僅維護工作小,編寫程序質量高,并且執行的速度快。

  28、如果要插入大的二進制值到Image列,使用存儲過程,千萬不要用內嵌INsert來插入(不知JAVA 是否)。因為這樣應用程序首先將二進制值轉換成字符串(尺寸是它的兩倍),服務器受到字符后又將他轉換成二進制值存儲過程就沒有這些動作,方法:Create procedure p_as into table(Fimage) values (@image), 在前臺調用這個存儲過程傳入二進制參數,這樣處理速度明顯改善。

原文轉自:http://database.ctocio.com.cn/422/12734922.shtml

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97