Ⅰ 影響資料庫性能的主要因素有哪些
以Mysql為例:
影響資料庫性能的主要因素總結如下:
1、sql查詢速度
2、網卡流量
3、伺服器硬體
4、磁碟IO
以上因素並不是時時刻刻都會影響資料庫性能,而就像木桶效應一樣。如果其中一個因素嚴重影響性能,那麼整個資料庫性能就會嚴重受阻。另外,這些影響因素都是相對的。
例如:當數據量並沒有達到百萬千萬這樣的級別,那麼sql查詢速度也許就不是個重要因素,換句話說,你的sql語句效率適當低下可能並不影響整個效率多少,反之,這種情況,無論如何怎麼優化sql語句,可能都沒有太明顯的效果。
相關內容拓展:
1、SQL查詢速度
風險:效率低下的SQL
2、網卡流量
風險:網卡IO被占滿(100Mb/8=100MB)
方案:
①減少從伺服器的數量。從伺服器都要從主伺服器上復制日誌,所以,從伺服器越多,網路流量越大。
②進行分級緩存。前方大量緩存突然失效會對資料庫造成嚴重的沖擊。
③避免使用「select * 」進行查詢
④分離業務網路和伺服器網路
3、磁碟IO
風險:磁碟IO性能突然下降。
方案:使用更好的磁碟設備解決。
Ⅱ SQL SERVER一個資料庫中使用大量的存儲過程,會影響性能嗎
一、在SQL Server中存儲過程不會影響性能。
1、只會大大的減輕伺服器的壓力,而不會增加,只有不合理的存儲過程才會造成伺服器性能下降的惡果。一個大型的資料庫,一般存儲過程也不會超過幾千個,對當前的資料庫及它依附的硬體來說,這點兒負載是大象身上的老鼠,負載基本可以怱略不計。
2、但是,存儲過程是批量的SQL語句的合成,如果設計上混亂,引發死循環、死鎖、大范圍查詢、臨時表沒有及時清理釋放等問題的情況下,是會嚴重影響伺服器性能的,但這根子不在存儲過程上,而在於存儲過程的設計上。錯誤的SQL代碼指揮伺服器,無論它的形式是存儲過程,還是客戶端及時發向資料庫的請求,都會使伺服器出現問題。
二、相關擴展
1、在當前,針對資料庫的編程設計,沒有存儲過程是不可想像的,這就象某個公司的大型貨品倉庫中沒有倉庫保管員一樣,所有的貨品進出都得進貨員或銷售員去臨時取放,會嚴重降低工作效率。
2、存儲過程在資料庫中無論是否編譯好,其效率都要比客戶端臨時向資料庫發送指令調數據來得要高,因為至少減少了發向伺服器的指令的量。況且很多的中間值、臨時值如果不通過存儲過程來實現的話,就只能先全取到客戶端,這樣會大大增加網路負擔與伺服器的負鉭。
3、正如微軟所說,存儲過程來實現,可以使得很多中間量不必傳入到客戶上,客戶端只能得到需要的結果,所以同時可以提高安全。
Ⅲ 影響數據檢索效率的幾個因素
影響數據檢索效率的幾個因素
數據檢索有兩種主要形態。第一種是純資料庫型的。典型的結構是一個關系型數據,比如 mysql。用戶通過 SQL 表達出所需要的數據,mysql 把 SQL 翻譯成物理的數據檢索動作返回結果。第二種形態是現在越來越流行的大數據玩家的玩法。典型的結構是有一個分區的數據存儲,最初這種存儲就是原始的 HDFS,後來開逐步有人在 HDFS 上加上索引的支持,或者乾脆用 Elasticsearc 這樣的數據存儲。然後在存儲之上有一個分布式的實時計算層,比如 Hive 或者 Spark SQL。用戶用 Hive SQL 提交給計算層,計算層從存儲里拉取出數據,進行計算之後返回給用戶。這種大數據的玩法起初是因為 SQL 有很多 ad-hoc 查詢是滿足不了的,乾脆讓用戶自己寫 map/rece 想怎麼算都可以了。但是後來玩大了之後,越來越多的人覺得這些 Hive 之類的方案查詢效率怎麼那麼低下啊。於是一個又一個項目開始去優化這些大數據計算框架的查詢性能。這些優化手段和經典的資料庫優化到今天的手段是沒有什麼兩樣的,很多公司打著搞計算引擎的旗號干著重新發明資料庫的活。所以,回歸本質,影響數據檢索效率的就那麼幾個因素。我們不妨來看一看。
數據檢索乾的是什麼事情
定位 => 載入 => 變換
找到所需要的數據,把數據從遠程或者磁碟載入到內存中。按照規則進行變換,比如按某個欄位group by,取另外一個欄位的sum之類的計算。
影響效率的四個因素
讀取更少的數據
數據本地化,充分遵循底層硬體的限制設計架構
更多的機器
更高效率的計算和計算的物理實現
原則上的四點描述是非常抽象的。我們具體來看這些點映射到實際的資料庫中都是一些什麼樣的優化措施。
讀取更少的數據
數據越少,檢索需要的時間當然越少了。在考慮所有技術手段之前,最有效果的恐怕是從業務的角度審視一下我們是否需要從那麼多的數據中檢索出結果來。有沒有可能用更少的數據達到同樣的效果。減少的數據量的兩個手段,聚合和抽樣。如果在入庫之前把數據就做了聚合或者抽樣,是不是可以極大地減少查詢所需要的時間,同時效果上並無多少差異呢?極端情況下,如果需要的是一天的總訪問量,比如有1個億。查詢的時候去數1億行肯定快不了。但是如果統計好了一天的總訪問量,查詢的時候只需要取得一條記錄就可以知道今天有1個億的人訪問了。
索引是一種非常常見的減少數據讀取量的策略了。一般的按行存儲的關系型資料庫都會有一個主鍵。用這個主鍵可以非常快速的查找到對應的行。KV存儲也是這樣,按照Key可以快速地找到對應的Value。可以理解為一個Hashmap。但是一旦查詢的時候不是用主鍵,而是另外一個欄位。那麼最糟糕的情況就是進行一次全表的掃描了,也就是把所有的數據都讀取出來,然後看要的數據到底在哪裡,這就不可能快了。減少數據讀取量的最佳方案就是,建立一個類似字典一樣的查找表,當我們找 username=wentao 的時候,可以列舉出所有有 wentao 作為用戶名的行的主鍵。然後拿這些主鍵去行存儲(就是那個hashmap)里撈數據,就一撈一個准了。
談到索引就不得不談一下一個查詢使用了兩個欄位,如何使用兩個索引的問題。mysql的行為可以代表大部分主流資料庫的處理方式:
基本上來說,經驗表明有多個單欄位的索引,最後資料庫會選一最優的來使用。其餘欄位的過濾仍然是通過數據讀取到內存之後,用predicate去判斷的。也就是無法減少數據的讀取量。
在這個方面基於inverted index的數據就非常有特點。一個是Elasticsearch為代表的lucene系的資料庫。另外一個是新銳的druid資料庫。
效果就是,這些資料庫可以把單欄位的filter結果緩存起來。多個欄位的查詢可以把之前緩存的結果直接拿過來做 AND 或者 OR 操作。
索引存在的必要是因為主存儲沒有提供直接的快速定位的能力。如果訪問的就是資料庫的主鍵,那麼需要讀取的數據也就非常少了。另外一個變種就是支持遍歷的主鍵,比如hbase的rowkey。如果查詢的是一個基於rowkey的范圍,那麼像hbase這樣的資料庫就可以支持只讀取到這個范圍內的數據,而不用讀取不再這個范圍內的額外數據,從而提高速度。這種加速的方式就是利用了主存儲自身的物理分布的特性。另外一個更常見的場景就是 partition。比如 mysql 或者 postgresql 都支持分區表的概念。當我們建立了分區表之後,查找的條件如果可以過濾出分區,那麼可以大幅減少需要讀取的數據量。比 partition 更細粒度一些的是 clustered index。它其實不是一個索引(二級索引),它是改變了數據在主存儲內的排列方式,讓相同clustered key的數據彼此緊挨著放在一起,從而在查詢的時候避免掃描到無關的數據。比 partition 更粗一些的是分庫分表分文件。比如我們可以一天建立一張表,查詢的時候先定位到表,再執行 SQL。比如 graphite 給每個 metric 創建一個文件存放採集來的 data point,查詢的時候給定metric 就可以定位到一個文件,然後只讀取這個文件的數據。
另外還有一點就是按行存儲和按列存儲的區別。按列存儲的時候,每個列是一個獨立的文件。查詢用到了哪幾個列就打開哪幾個列的文件,沒有用到的列的數據碰都不會碰到。反觀按行存儲,一張中的所有欄位是彼此緊挨在磁碟上的。一個表如果有100個欄位,哪怕只選取其中的一個欄位,在掃描磁碟的時候其餘99個欄位的數據仍然會被掃描到的。
考慮一個具體的案例,時間序列數據。如何使用讀取更少的數據的策略來提高檢索的效率呢?首先,我們可以保證入庫的時間粒度,維度粒度是正好是查詢所需要的。如果查詢需要的是5分鍾數據,但是入庫的是1分鍾的,那麼就可以先聚合成5分鍾的再存入資料庫。對於主存儲的物理布局選擇,如果查詢總是針對一個時間范圍的。那麼把 timestamp 做為 hbase 的 rowkey,或者 mysql 的 clustered index 是合適。這樣我們按時間過濾的時候,選擇到的是一堆連續的數據,不用讀取之後再過濾掉不符合條件的數據。但是如果在一個時間范圍內有很多中數據,比如1萬個IP,那麼即便是查1個IP的數據也需要把1萬個IP的數據都讀取出來。所以可以把 IP 維度也編碼到 rowkey 或者 clustered index 中。但是假如另外還有一個維度是 OS,那麼查詢的時候 IP 維度的 rowkey 是沒有幫助的,仍然是要把所有的數據都查出來。這就是僅依靠主存儲是無法滿足各種查詢條件下都能夠讀取更少的數據的原因。所以,二級索引是必要的。我們可以把時間序列中的所有維度都拿出來建立索引,然後查詢的時候如果指定了維度,就可以用二級索引把真正需要讀取的數據過濾出來。但是實踐中,很多資料庫並不因為使用了索引使得查詢變快了,有的時候反而變得更慢了。對於 mysql 來說,存儲時間序列的最佳方式是按時間做 partition,不對維度建立任何索引。查詢的時候只過濾出對應的 partition,然後進行全 partition 掃描,這樣會快過於使用二級索引定位到行之後再去讀取主存儲的查詢方式。究其原因,就是數據本地化的問題了。
[page]
數據本地化
數據本地化的實質是軟體工程師們要充分尊重和理解底層硬體的限制,並且用各種手段規避問題最大化利用手裡的硬體資源。本地化有很多種形態
最常見的最好理解的本地化問題是網路問題。我們都知道網路帶寬不是無限的,比本地磁碟慢多了。如果可能盡量不要通過網路去訪問數據。即便要訪問,也應該一次抓取多一些數據,而不是一次搞一點,然後搞很多次。因為網路連接和來回的開銷是非常高的。這就是 data locality 的問題。我們要把計算盡可能的靠近數據,減少網路上傳輸的數據量。
這種帶寬引起的本地化問題,還有很多。網路比硬碟慢,硬碟比內存慢,內存比L2緩存慢。做到極致的資料庫可以讓計算完全發生在 L2 緩存內,盡可能地避免頻繁地在內存和L2之間倒騰數據。
另外一種形態的問題化問題是磁碟的順序讀和隨機讀的問題。當數據彼此靠近地物理存放在磁碟上的時候,順序讀取一批是非常快的。如果需要隨機讀取多個不連續的硬碟位置,磁頭就要來回移動從而使得讀取速度快速下降。即便是 SSD 硬碟,順序讀也是要比隨機讀快的。
基於盡可能讓數據讀取本地化的原則,檢索應該盡可能地使用順序讀而不是隨機讀。如果可以的話,把主存儲的row key或者clustered index設計為和查詢提交一樣的。時間序列如果都是按時間查,那麼按時間做的row key可以非常高效地以順序讀的方式把數據拉取出來。類似地,按列存儲的數據如果要把一個列的數據都取出來加和的話,可以非常快地用順序讀的方式載入出來。
二級索引的訪問方式典型的隨機讀。當查詢條件經過了二級索引查找之後得到一堆的主存儲的 key,那麼就需要對每個 key 進行一次隨機讀。即便彼此僅靠的key可以用順序讀做一些優化,總體上來說仍然是隨機讀的模式。這也就是為什麼時間序列數據在 mysql 里建立了索引反而比沒有建索引還要慢的原因。
為了盡可能的利用順序讀,人們就開始想各種辦法了。前面提到了 mysql 里的一行數據的多個列是彼此緊靠地物理存放的。那麼如果我們把所需要的數據建成多個列,那麼一次查詢就可以批量獲得更多的數據,減少隨機讀取的次數。也就是把之前的一些行變為列的方式來存放,減少行的數量。這種做法的經典案例就是時間序列數據,比如可以一分鍾存一行數據,每一秒的值變成一個列。那麼行的數量可以變成之前的1/60。
但是這種行變列的做法在按列存儲的資料庫里就不能直接照搬了,有些列式資料庫有column family的概念,不同的設置在物理上存放可能是在一起的也可能是分開的。對於 Elasticsearch 來說,要想減少行的數量,讓一行多pack一些數據進去,一種做法就是利用 nested document。內部 Elasticsearch 可以保證一個 document 下的所有的 nested document是物理上靠在一起放在同一個 lucene 的 segment 內。
網路的data locality就比較為人熟知了。map rece的大數據計算模式就是利用map在數據節點的本地把數據先做一次計算,往往計算的結果可以比原數據小很多。然後再通過網路傳輸匯總後做 rece 計算。這樣就節省了大量網路傳輸數據的時間浪費和資源消耗。現在 Elasticsearch 就支持在每個 data node 上部署 spark。由 spark 在每個 data node 上做計算。而不用把數據都查詢出來,用網路傳輸到 spark 集群里再去計算。這種資料庫和計算集群的混合部署是高性能的關鍵。類似的還有 storm 和 kafka 之間的關系。
網路的data locality還有一個老大難問題就是分布式大數據下的多表join問題。如果只是查詢一個分布式表,那麼把計算用 map rece 表達就沒有多大問題了。但是如果需要同時查詢兩個表,就意味著兩個表可能不是在物理上同樣均勻分布的。一種最簡單的策略就是找出兩張表中最小的那張,然後把表的內容廣播到每個節點上,再做join。復雜一些的是對兩個單表做 map rece,然後按照相同的 key 把部分計算的結果匯集在一起。第三種策略是保證數據分布的方式,讓兩張表查詢的時候需要用到的數據總在一起。沒有完美的方案,也不大可能有完美的方案。除非有一天網路帶寬可以大到忽略不計的地步。
更多的機器
這個就沒有什麼好說的了。多一倍的機器就多一倍的 CPU,可以同時計算更多的數據。多一倍的機器就多一倍的磁頭,可以同時掃描更多的位元組數。很多大數據框架的故事就是講如何如何通過 scale out解決無限大的問題。但是值得注意的是,集群可以無限大,數據可以無限多,但是口袋裡的銀子不會無限多的。堆機器解決問題比升級大型機是要便宜,但是機器堆多了也是非常昂貴的。特別是 Hive 這些從一開始就是分布式多機的檢索方案,剛開始的時候效率並不高。堆機器是一個乘數,當資料庫本來單機性能不高的時候,乘數大並不能起到決定性的作用。
更高效的計算和計算實現
檢索的過程不僅僅是磁碟掃描,它還包括一個可簡單可復雜的變換過程。使用 hyperloglog,count min-sketch等有損演算法可以極大地提高統計計算的性能。資料庫的join也是一個經常有演算法創新的地方。
計算實現就是演算法是用C++實現的還是用java,還是python實現的。用java是用大Integer實現的,還是小int實現的。不同的語言的實現方式會有一些固定的開銷。不是說快就一定要C++,但是 python 寫 for 循環是顯然沒有指望的。任何數據檢索的環節只要包含 python/ruby 這些語言的逐條 for 循環就一定快不起來了。
結論
希望這四點可以被記住,成為一種指導性的優化數據檢索效率的思維框架。無論你是設計一個mysql表結構,還是優化一個spark sql的應用。從這四個角度想想,都有哪些環節是在拖後腿的,手上的工具有什麼樣的參數可以調整,讓隨機讀變成順序讀,表結構怎麼樣設計可以最小化數據讀取的量。要做到這一點,你必須非常非常了解工具的底層實現。而不是盲目的相信,xx資料庫是最好的資料庫,所以它一定很快之類的。如果你不了解你手上的資料庫或者計算引擎,當它快的時候你不知道為何快,當它慢的時候你就更加無從優化了。
Ⅳ 硬碟和CPU緩存對計算機整體性能的影響
CPU緩存(Cache Memory)是位於CPU與內存之間的臨時存儲器!它的容量比內存小的多但是交換速度卻比內存要快得多。
緩存的出現主要是為了解決CPU運算速度與內存讀寫速度不匹配的矛盾,因為CPU運算速度要比內存讀寫速度快很多,這樣會使CPU花費很長時間等待數據到來或把數據寫入內存。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速度。由此可見,在CPU中加入緩存是一種高效的解決方案,這樣整個內存儲器(緩存+內存)就變成了既有緩存的高速度,又有內存的大容量的存儲系統了。因此,緩存對CPU的性能影響很大。
cpu緩存的工作原理是當CPU要讀取一個數據時,首先從緩存中查找,找到就立即讀取並送給CPU處理;沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入緩存中,可以使得以後對整塊數據的讀取都從緩存中進行,不必再調用內存。正是這樣的讀取機制使CPU讀取緩存的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在緩存中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先緩存後內存。
硬碟的緩存主要起三種作用:一是預讀取。當硬碟受到CPU指令控制開始讀取數據時,硬碟上的控制晶元會控制磁頭把正在讀取的簇的下一個或者幾個簇中的數據讀到緩存中(由於硬碟上數據存儲時是比較連續的,所以讀取命中率較高),當需要讀取下一個或者幾個簇中的數據的時候,硬碟則不需要再次讀取數據,直接把緩存中的數據傳輸到內存中就可以了,由於緩存的速度遠遠高於磁頭讀寫的速度,所以能夠達到明顯改善性能的目的;二是對寫入動作進行緩存。當硬碟接到寫入數據的指令之後,並不會馬上將數據寫入到碟片上,而是先暫時存儲在緩存里,然後發送一個「數據已寫入」的信號給系統,這時系統就會認為數據已經寫入,並繼續執行下面的工作,而硬碟則在空閑(不進行讀取或寫入的時候)時再將緩存中的數據寫入到碟片上。
Ⅳ 哪些因素影響了資料庫性能
網路寬頻,磁碟IO,查詢速度都會影響到資料庫的性能。
具體問題具體分析,舉例來說明為什麼磁碟IO成瓶頸資料庫的性能急速下降了。
為什麼當磁碟IO成瓶頸之後, 資料庫的性能不是達到飽和的平衡狀態,而是急劇下降。為什麼資料庫的性能有非常明顯的分界點,原因是什麼?
相信大部分做資料庫運維的朋友,都遇到這種情況。 資料庫在前一天性能表現的相當穩定,資料庫的響應時間也很正常,但就在今天,在業務人員反饋業務流量沒有任何上升的情況下,資料庫的變得不穩定了,有時候一個最簡單的insert操作, 需要幾十秒,但99%的insert卻又可以在幾毫秒完成,這又是為什麼了?
dba此時心中有無限的疑惑,到底是什麼原因呢? 磁碟IO性能變差了?還是業務運維人員反饋的流量壓根就不對? 還是資料庫內部出問題?昨天不是還好好的嗎?
當資料庫出現響應時間不穩定的時候,我們在操作系統上會看到磁碟的利用率會比較高,如果觀察仔細一點,還可以看到,存在一些讀的IO. 資料庫伺服器如果存在大量的寫IO,性能一般都是正常跟穩定的,但只要存在少量的讀IO,則性能開始出現抖動,存在大量的讀IO時(排除配備非常高速磁碟的機器),對於在線交易的資料庫系統來說,大概性能就雪崩了。為什麼操作系統上看到的磁碟讀IO跟寫IO所帶來的性能差距這么大呢?
如果親之前沒有注意到上述的現象,親對上述的結論也是懷疑。但請看下面的分解。
在寫這個文章之前,作者閱讀了大量跟的IO相關的代碼,如非同步IO線程的相關的,innodb_buffer池相關的,以及跟讀數據塊最相關的核心函數buf_page_get_gen函數以及其調用的相關子函數。為了將文章寫得通俗點,看起來不那麼累,因此不再一行一行的將代碼解析寫出來。
咱們先來提問題。buf_page_get_gen函數的作用是從Buffer bool裡面讀數據頁,可能存在以下幾種情況。
提問. 數據頁不在buffer bool 裡面該怎麼辦?
回答:去讀文件,將文件中的數據頁載入到buffer pool裡面。下面是函數buffer_read_page的函數,作用是將物理數據頁載入到buffer pool, 圖片中顯示
buffer_read_page函數棧的頂層是pread64(),調用了操作系統的讀函數。
通過解析buf_wait_for_read函數的下層函數,我們知道其實通過首先自旋加鎖pin的方式,超過設定的自旋次數之後,進入等待,等待IO完成被喚醒。這樣節省不停自旋pin時消耗的cpu,但需要付出被喚起時的開銷。
再繼續擴展問題: 如果會話線程A 經過物理IO將數據頁1001讀入buffer之後,他需要修改這個頁,而在會話線程A之後的其他的同樣需要訪問數據頁1001的會話線程,即使在數據頁1001被入讀buffer pool之後,將仍然處於等待中。因為在數據頁上讀取或者更新的時候,同樣需要上鎖,這樣才能保證數據頁並發讀取/更新的一致性。
由此可見,當一個高並發的系統,出現了熱點數據頁需要從磁碟上載入到buffer pool中時,造成的延遲,是難以想像的。因此排在等待熱點頁隊列最後的會話線程最後才得到需要的頁,響應時間也就越長,這就是造成了一個簡單的sql需要執行幾十秒的原因。
再回頭來看上面的問題,mysql資料庫出現性能下降時,可以看到操作系統有讀IO。 原因是,在資料庫對數據頁的更改,是在內存中的,然後通過檢查點線程進行非同步寫盤,這個非同步的寫操作是不堵塞執行sql的會話線程的。所以,即使看到操作系統上有大量的寫IO,資料庫的性能也是很平穩的。但當用戶線程需要查找的數據頁不在buffer pool中時,則會從磁碟上讀取,在一個熱點數據頁不是非常多的情況下,我們設置足夠大的innodb_buffer_pool的size, 基本可以緩存所有的數據頁,因此一般都不會出現缺頁的情況,也就是在操作系統上基本看不到讀的IO。 當出現讀的IO時,原因時在執行buf_read_page_low函數,從磁碟上讀取數據頁到buffer pool, 則資料庫的性能則開始下降,當出現大量的讀IO,資料庫的性能會非常差。
Ⅵ 數據的存儲結構與數據的處理效率有關
當然有關了,就好像你往書櫃里放書,不同的放書的方式會影響你找這本書的速度。
Ⅶ 資料庫存取效率的主要因素是什麼
模型反映現實世界各部門的信息結構、信息流動情況、信息間的互相制約關系以及各部門對信息儲存、查詢和加工的要求等。
邏輯設計說白了就設計數據表裡的欄位 數據屬性 可能還需為各種數據處理應用領域產生相應的邏輯子模式
物理設計 簡單的說就是 數據 的存儲方式和存儲的路徑
不知道這樣說 你能理解么
Ⅷ 影響資料庫操作效率(增、刪、改、查)的關鍵因素有哪些
1、把數據、日誌、索引放到不同的I/O設備上,增加讀取速度,以前可以將Tempdb應放在RAID0上,SQL2000不在支持。數據量(尺寸)越大,提高I/O越重要.
2、縱向、橫向分割表,減少表的尺寸(sp_spaceuse)
3、升級硬體
4、根據查詢條件,建立索引,優化索引、優化訪問方式,限制結果集的數據量。注意填充因子要適當(最好是使用默認值0)。索引應該盡量小,使用位元組數小的列建索引好(參照索引的創建),不要對有限的幾個值的欄位建單一索引如性別欄位
5、提高網速;
6、擴大伺服器的內存,Windows 2000和SQL server 2000能支持4-8G的內存。配置虛擬內存:虛擬內存大小應基於計算機上並發運行的服務進行配置。運行 Microsoft SQL Server? 2000 時,可考慮將虛擬內存大小設置為計算機中安裝的物理內存的 1.5 倍。如果另外安裝了全文檢索功能,並打算運行 Microsoft 搜索服務以便執行全文索引和查詢,可考慮:將虛擬內存大小配置為至少是計算機中安裝的物理內存的 3 倍。將 SQL Server max server memory 伺服器配置選項配置為物理內存的 1.5 倍(虛擬內存大小設置的一半)。
7、增加伺服器CPU個數;但是必須明白並行處理串列處理更需要資源例如內存。使用並行還是串列程是MsSQL自動評估選擇的。單個任務分解成多個任務,就可以在處理器上運行。例如耽擱查詢的排序、連接、掃描和GROUP BY字句同時執行,SQL SERVER根據系統的負載情況決定最優的並行等級,復雜的需要消耗大量的CPU的查詢最適合並行處理。但是更新操作UPDATE,INSERT,DELETE還不能並行處理。
8、如果是使用like進行查詢的話,簡單的使用index是不行的,但是全文索引,耗空間。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查詢時,查詢耗時和欄位值總長度成正比,所以不能用CHAR類型,而是VARCHAR。對於欄位的值很長的建全文索引。
9、DB Server 和APPLication Server 分離;OLTP和OLAP分離
10、分布式分區視圖可用於實現資料庫伺服器聯合體。聯合體是一組分開管理的伺服器,但它們相互協作分擔系統的處理負荷。這種通過分區數據形成資料庫伺服器聯合體的機制能夠擴大一組伺服器,以支持大型的多層 Web 站點的處理需要。有關更多信息,參見設計聯合資料庫伺服器。(參照SQL幫助文件'分區視圖')
a、在實現分區視圖之前,必須先水平分區表
b、在創建成員表後,在每個成員伺服器上定義一個分布式分區視圖,並且每個視圖具有相同的名稱。這樣,引用分布式分區視圖名的查詢可以在任何一個成員伺服器上運行。系統操作如同每個成員伺服器上都有一個原始表的復本一樣,但其實每個伺服器上只有一個成員表和一個分布式分區視圖。數據的位置對應用程序是透明的。
11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收縮數據和日誌 DBCC SHRINKDB,DBCC SHRINKFILE. 設置自動收縮日誌.對於大的資料庫不要設置資料庫自動增長,它會降低伺服器的性能。 在T-sql的寫法上有很大的講究,下面列出常見的要點:首先,DBMS處理查詢計劃的過程是這樣的:
1、 查詢語句的詞法、語法檢查
2、 將語句提交給DBMS的查詢優化器
3、 優化器做代數優化和存取路徑的優化
4、 由預編譯模塊生成查詢規劃
5、 然後在合適的時間提交給系統處理執行
6、 最後將執行結果返回給用戶其次,看一下SQL SERVER的數據存放的結構:一個頁面的大小為8K(8060)位元組,8個頁面為一個盤區,按照B樹存放。
12、Commit和rollback的區別 Rollback:回滾所有的事物。 Commit:提交當前的事物. 沒有必要在動態SQL里寫事物,如果要寫請寫在外面如: begin tran exec(@s) commit trans 或者將動態SQL 寫成函數或者存儲過程。
13、在查詢Select語句中用Where字句限制返回的行數,避免表掃描,如果返回不必要的數據,浪費了伺服器的I/O資源,加重了網路的負擔降低性能。如果表很大,在表掃描的期間將表鎖住,禁止其他的聯接訪問表,後果嚴重。
14、SQL的注釋申明對執行沒有任何影響
還有很多技巧,可以平時使用中體會。
Ⅸ 用哈希(散列)方法處理沖突(碰撞)可能出現堆積(聚集)現象,為什麼「存儲效率」會受堆積現象直接影響
因為可能數據會重復
簡單的例子,網路網盤檢查你上傳的文件是否違規,就會將你的文件哈希值與違規文件的進行比對,假如你的文件或數據與違規庫中的文件的哈希值沖突(碰撞),那麼激動文件就會被誤封。
Ⅹ SQL SERVER 一個資料庫中使用大量的存儲過程,會影響性能嗎
一、在SQL Server中存儲過程不會影響性能。
1、只會大大的減輕伺服器的壓力,而不會增加,只有不合理的存儲過程才會造成伺服器性能下降的惡果。一個大型的資料庫,一般存儲過程也不會超過幾千個,對當前的資料庫及它依附的硬體來說,這點兒負載是大象身上的老鼠,負載基本可以怱略不計。
2、但是,存儲過程是批量的SQL語句的合成,如果設計上混亂,引發死循環、死鎖、大范圍查詢、臨時表沒有及時清理釋放等問題的情況下,是會嚴重影響伺服器性能的,但這根子不在存儲過程上,而在於存儲過程的設計上。錯誤的SQL代碼指揮伺服器,無論它的形式是存儲過程,還是客戶端及時發向資料庫的請求,都會使伺服器出現問題。
二、相關擴展
1、在當前,針對資料庫的編程設計,沒有存儲過程是不可想像的,這就象某個公司的大型貨品倉庫中沒有倉庫保管員一樣,所有的貨品進出都得進貨員或銷售員去臨時取放,會嚴重降低工作效率。
2、存儲過程在資料庫中無論是否編譯好,其效率都要比客戶端臨時向資料庫發送指令調數據來得要高,因為至少減少了發向伺服器的指令的量。況且很多的中間值、臨時值如果不通過存儲過程來實現的話,就只能先全取到客戶端,這樣會大大增加網路負擔與伺服器的負鉭。
3、正如微軟所說,存儲過程來實現,可以使得很多中間量不必傳入到客戶上,客戶端只能得到需要的結果,所以同時可以提高安全。