国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Ad-hoc 查詢以及動態SQL的罪惡[譯]

2024-07-21 02:49:38
字體:
來源:轉載
供稿:網友
Ad-hoc 查詢以及動態SQL的罪惡[譯] 2014-07-29 14:28 by JentleWang, ... 閱讀, ... 評論, 收藏, 編輯

本文為翻譯文章,原文地址:https://www.simple-talk.com/blogs/2009/08/03/stolen-pages-ad-hoc-queries-and-the-sins-of-dynamic-sql-in-the-application/ 

  

  前言

  在硬件資源非常有限的SQLServer服務器上進行開發,有一大優勢,就是錯誤是可視化的,即你很快就會因為你的錯誤而受到懲罰。譬如,應用中過多使用ad-hoc動態查詢的產生的問題會很快暴露出來。開發者可能會向你抱怨,數據庫運行的越來越慢。你也將會發現服務器CPU的使用率非常高,甚至接近100%,但是在性能較差的時段,卻沒有阻塞的發生。

  在極端的情況下,你甚至可能接受到如下的錯誤:

  Error: 701, Severity: 17, State: 1  There is insufficient system memory to run this query.

  或者

  Msg 8645, Level 17, State 1, PRocedure , Line 1  A time out occurred while waiting for memory resources to execute the query. Re-run the query. 

  分析

  你會發現運行過多的ad-hoc查詢所有造成的不良影響。CPU利用率高是因為查詢優化器需要編譯大量的ad-hoc查詢。內存壓力是因為一些內存用來緩存ad-hoc查詢生成的執行計劃。換句話說,開發者使用了Ad-hoc查詢,而不是使用存儲過程或者參數化的查詢。這是非常愚蠢的。

  一個編譯好的執行計劃大約占用70KB的空間,而一個存儲過程的執行計劃,根據其復雜度,大約占用2到3倍的空間。區別是每個存儲過程只有一個執行計劃。使用Ad-hoc查詢,你將冒著每個查詢都有一個單獨的執行計劃的風險。

  執行計劃緩存起來是為了被重用的,SQLServer需要占用內存來存儲執行計劃,這部分內存按照申請方式稱為StolenPages。其他占用StolenPages的對象包括了Connections、Locks 和 Transaction Context等一些內存Consumer以及線程和第三方代碼消耗的內存。這是一個簡單的日常任務分配內存的方式,但是當數據庫接受到非常多的Ad-hoc查詢時,將會產生麻煩。除非SQLServer可以確定查詢可以自動的參數化或者說新的查詢和已緩存的查詢一致,否則SQLServer就會重新生成一個執行計劃。可能不長時間,你就會看到數據緩存產生瓶頸 

  那么如何確定系統是否存在這種問題

  1.檢查編譯查詢計劃的數量。SQLServer性能監視器將會顯示SQL Compilations/sec 有比較高的數值。理論上,SQL Recompilations/sec 和 Batch Requests/sec 的比率應該會非常低

  2.DBCC MemoryStatus 也會顯示出stolen pages的數量會上升

  確定問題后,如何解決

  1. 使用存儲過程來執行

  2. 使用參數化查詢

  實例演示 略 具體見原網址

  如有不對的地方,歡迎拍磚,謝謝!O(∩_∩)O


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 雷山县| 错那县| 菏泽市| 新宁县| 龙泉市| 侯马市| 三穗县| 南涧| 娱乐| 丰台区| 绥阳县| 中方县| 汶上县| 东辽县| 西藏| 宣化县| 大渡口区| 临漳县| 涟水县| 桐梓县| 体育| 准格尔旗| 濮阳县| 英吉沙县| 化德县| 青浦区| 陵川县| 鄂托克前旗| 元江| 罗甸县| 建宁县| 天水市| 思南县| 玛曲县| 新郑市| 治多县| 敦煌市| 屯昌县| 岳阳县| 廊坊市| 贡觉县|