2008年9月30日 星期二

SQL定序

Server: Msg 446, Level 16, State 9, Line 1
Cannot resolve collation conflict for equal to operation.

當你在建立DATABASE時可以選擇collation(定序),若你無法重建DATABASE,則可以調整每個TABLE中每個欄位的collation(定序)。

如果你跨DB join,則所有join的欄位定序都必須相同,否則就會出現你目前的錯誤,你可以進入Enterprise Manager中,選到你要的TABLE,按右鍵選擇Design Table,選到你要join的欄位,就可以設定collation(定序)。

當A與B的定序不同
合併讀取資時會因為定序值不同而出現錯誤訊息
Cannot resolve collation conflict for equal to operation

更改為以下後就可以直接抓取到資料
where A.username COLLATE Chinese_Taiwan_Stroke_CI_AS= B.username COLLATE Chinese_Taiwan_Stroke_CI_AS

2008年9月16日 星期二

IIS檔案上傳size限制

如果您是Windows 2003 Server IIS 6用BASP21元件上傳檔案時,只要檔案超過 200K 就會發生 ASP 0104 '80004005' 的錯誤,
要求物件 錯誤 'ASP 0104 : 80004005' 不允許的操作,原因是web server的內定值被限制

以記事本開啟 C:\windows\sytem32\inetserv\metabase.xml
上傳限制:
找尋 AspMaxRequestEntityAllowed 字串
將 204800 (200K) 修改成你要的數字
下載限制:
找尋 AspBufferingLimit 字串
預設 4MB ,將它修改成你要的數字

該檔案由於被 IIS 系統使用中
請於 IIS 管理員中,於[本機電腦]上點右鍵
選擇[內容]進入後,將[啟用直接編輯 metabase 檔案] 勾選
即可變更metabase.xml檔案內容。

2008年9月12日 星期五

SQL2005 part4

將800多萬筆, 31GB的資料轉到新的機器後, 暫時已能應付ap server的存取, 從performance monitor觀察IO數據、SQL的效能指標都很不錯, 但cpu loading還是一直居高不下

從工作管理員看sqlserver.exe的記體使用量一直維持在131MB左右, 但可用記憶體剩2G多, 很怪! 另一台只有4G Ram的在工作管理員顯示吃到2.7G多(原因是開啟AWE後得從SQLSERVER: Total server memory看才正確!)

雖然很不想去動資料面, 畢竟這是廠商的職責, 不過看這樣子他們也是沒什麼招可玩了...
把自己學過的一點點東西拼湊起來急救看看, 先用sql profiler觀察一下, 大致是select幾個比較大的table時, cpu loading會衝到近滿載, 看了一下竟然沒建索引!! 自己照著畫面隨便建了幾個索引, 沒想到cpu loading馬上降下來!!

繼續把profiler錄下的語法拿到sql tuning advisor執行計畫跑看看, 工作成本變成原來的1/10, 感覺還滿爽的, 繼續再建幾個table的索引, 果然cpu好像吃了維骨力, 爬樓梯都不會喘了..傑克!這真是太神奇啦~~

更意外的是可用記憶體剩不到500MB啦(微軟建議/3gb跟AWE最好不要同時啟用, 以免造成OS記憶體不足, 這點有待觀察), performance monitor的SQLSERVER: Total server memory計數器數字也變成7G多, 看起來正常多了

A generic error occurred in GDI+

在使用.net 2.0產生圖檔要寫入server時常碰到這個錯誤(怒!!)
大部分原因是出在對該資料夾的寫入權限不足,或是沒有先產生該資料夾造成
-- 那你寫這什麼訊息啊! (/‵Д′)/~ ╧╧


微軟對該問題的KB
http://support.microsoft.com/?id=814675

2008年9月10日 星期三

SQL 2005 重要效能計數物件(Performance Counter)及建議值

列舉部份供參考:

Object

Counter

Preferred Value

Memory

Available Mbytes

> 100MB

Paging File

%Usage

< 70%

Process (sqlservr)

%Privileged Time

< 30% of %Processor Time (sqlservr)

Processor

%Privileged Time

< 30% of Total %Processor Time

PhysicalDisk

Avg. Disk Sec/Read

< 8ms

PhysicalDisk

Avg. Disk sec/Write

< 8ms (non cached) < 1ms (cached)

SQLServer:Access Methods

Forwarded Records/sec

< 10 per 100 Batch Requests/Sec

SQLServer:Access Methods

FreeSpace Scans/sec

<10 per 100 Batch Requests/Sec

SQLServer:Access Methods

Full Scans / sec

(Index Searches/sec)/(Full Scans/sec) > 1000

SQLServer:Access Methods

Workfiles Created/Sec

< 20 per 100 Batch Requests/Sec

SQLServer:Access Methods

Worktables Created/Sec

< 20 per 100 Batch Requests/Sec

SQL Server:Buffer Manager

Buffer Cache hit ratio

> 90%

SQL Server:Buffer Manager

Free list stalls/sec

< 2

SQL Server:Buffer Manager

Lazy Writes/Sec

< 20

SQL Server:Buffer Manager

Page Life Expectancy

> 300

SQLServer:Buffer Manager

Page lookups/sec

(Page lookups/sec) / (Batch Requests/sec) < 100

SQL Server:Locks

Lock Requests/sec

(Lock Request/sec)/(Batch Requests/sec) < 500

SQLServer:SQL Statistics

SQL Compilations/sec

< 10% of the number of Batch Requests/Sec

SQLServer:SQL Statistics

SQL Re-Compilations/sec

< 10% of the number of SQL Compilations


詳細資訊:

TechNet Webcast: SQL Server Performance Counter Guidance (Level 300)

http://www.microsoft.com/events/EventDetails.aspx?CMTYSvcSource=MSCOMMedia&Params=%7eCMTYDataSvcParams%5e%7earg+Name%3d%22ID%22+Value%3d%221032357640%22%2f%5e%7earg+Name%3d%22ProviderID%22+Value%3d%22A6B43178-497C-4225-BA42-DF595171F04C%22%2f%5e%7earg+Name%3d%22lang%22+Value%3d%22en%22%2f%5e%7earg+Name%3d%22cr%22+Value%3d%22US%22%2f%5e%7esParams%5e%7e%2fsParams%5e%7e%2fCMTYDataSvcParams%5e

SQL2005 part3

針對 4 GB 以上的實體記憶體啟用記憶體支援

預設會停用 Windows 原則鎖定記憶體分頁選項。必須啟用這個權限,才可設定 Address Windowing Extensions (AWE)。此原則決定哪些帳戶可以使用處理序將資料保留在實體記憶體中,以防止系統將資料傳送到磁碟上的虛擬記憶體。在 32 位元作業系統上,如果在未使用 AWE 時設定這個權限,則會明顯降低系統效能。雖然非必要,不過我們建議在使用 64 位元作業系統時在記憶體中鎖定分頁。

請注意 對於 64 位元版本的 SQL Server 2005,只有 SQL Server 2005 Enterprise Edition 可以向右使用 鎖定分頁記憶體中的 使用者。

要指派 在記憶體中的鎖定分頁 使用者權限,請依照下列步驟執行:1. 請按一下 [ 開始 ] ,再按一下 [ 執行 ] ,鍵入 gpedit.msc ,然後再按一下 [ 確定 ] 。 群組原則 ] 對話方塊隨即出現。
2. 展開 [ 電腦組態 ,然後展開 [ Windows 設定 ] 。
3. 展開 [ 安全性設定 ,然後再展開 [ 本機原則 ] 。
4. 請依序按一下 [ 使用者權限指派 ] ,依序及 [ 鎖定分頁記憶體中 。
5. 在 [ 本機安全性原則設定 ] 對話方塊中,按一下 [ 新增使用者或群組 。
6. 在 [ 選取使用者或群組 ] 對話方塊,新增的帳戶擁有執行 Sqlservr.exe 檔案,使用權限,然後按一下 [ 確定 ] 。
7. 關閉 群組原則 ] 對話方塊。
8. 重新啟動 SQL Server 服務。.
您將 在記憶體中的鎖定分頁 使用者權限指派並重新啟動 SQL Server 服務之後,Windows 作業系統不再出 SQL Server 中緩衝區集區記憶體頁面處理。 不過,Windows 作業系統仍然可以分頁在 SQL Server 處理序內 nonbuffer 集區記憶體不足。


若要針對 SQL Server 2005 的執行個體啟用 AWE,請使用 sp_configure 將 awe enabled 選項設為 1,然後重新啟動 SQL Server。因為 SQL Server 啟動時會啟用 AWE,並直到 SQL Server 關機為止,所以在使用 awe enabled 時,SQL Server 會傳送「已啟用 Address Windowing Extensions」訊息到 SQL Server 錯誤記錄檔以通知使用者。

網路應用程式的資料輸送量最大化
如果選取了 [網路連線] 中的 [檔案共用的資料輸送量最大化] 選項,作業系統會將優先權撥給執行緩衝輸入/輸出 (I/O) 作業的應用程式,方法是在檔案系統快取中,快取這些應用程式的 I/O 頁面。這個選項會限制 SQL Server 可用於一般作業的記憶體。

2008年9月8日 星期一

SQL2005 part2

一些SQL Server的基本設定事項:

所有資料庫軟體的主要設計目的之一,便是將磁碟 I/O 最小化,因為磁碟的讀取和寫入,是電腦上最需要用到大量資源的作業之一。SQL Server 會在記憶體中建立緩衝集區,以保存從資料庫讀取的頁面。SQL Server 的大部分程式碼,主要是用來最小化磁碟和緩衝集區之間實體讀取和寫入數目。SQL Server 會嘗試在兩個目標之間取得平衡: 避免緩衝集區過大,造成整個系統的記憶體不足。 最大化緩衝集區的大小以最小化資料庫檔案的實體 I/O。

資料庫實在是IT又愛又恨的東西,以前公司的資料庫,大約在table成長到約100萬筆資料時,效能瞬間down到不能用,只能靠刪除資料的方式恢復效能,大約回到90萬筆就很快了,SQL Server你真行! Orz
不過比起另一個系統把預約單檔案(1~5KB),存放在另一台server的share folder(EMC DMX等級的SAN哦),等要用到時再去讀取,結果就是檔案到了約10萬個以後開始讀取寫入都會漏資料!! 最慘的是沒有log,無從找出問題。
現在回想起來,如果選擇用資料庫來處理這種需求。100萬筆資料vs.100萬個檔案,很明顯資料庫對100萬筆資料處理還算輕而易舉,DB雖然也會有瓶頸及tuning的問題,但好歹有方法可以依循,有架構可以利用,更重要的有很多工具找出問題。

在32-bit CPU memory 配置中

  • 8G的預設配置如下:
    OS 2GB
    APP 2GB(包含SQL SERVER及其它應用程式)
    剩餘4GB(未使用)
  • 8G的設定 /3GB 的配置如下:
    OS 1GB
    APP 3GB(包含SQL SERVER及其它應用程式)
    剩餘4GB(未使用)
  • 8G的設定 /PAE 的配置如下:
    OS 2GB
    APP 2GB(包含SQL SERVER及其它應用程式)
    剩餘4GB(給BUFFER CACHE資料快取使用)
  • 8G的設定 /PAE /3GB 的配置如下:
    OS 1GB
    APP 3GB(包含SQL SERVER及其它應用程式)
    剩餘4GB(給BUFFER CACHE資料快取使用)

在64-bit CPU memory 配置中

  • 8G的設定的配置(系統自行配置)如下:
    OS 1GB(可另行設定)
    剩餘7GB(包含SQL SERVER及其它應用程式)

    若你的記憶體超過16GB則不可設定 /3GB及/PAE,因為OS一定要吃2GB

    啟用 AWE 功能之後,SQL Server 就無法動態管理記憶體,簡單地說,就是它會用掉所有可用的記憶體


    參考: SQL Server的記憶體架構
    http://technet.microsoft.com/zh-tw/library/ms187499.aspx

前天裝好了x86-64的2003+sql2005想說把爛爛的server多榨出一點效能來,看能不能撐到user要的5年資料(估計150G),結果廠商來裝他們的軟體竟然說"我們的程式抓不到64位元os的odbc"...Orz
odbc不就是個API嗎?還會抓不到,真詭異。不過更詭異的還在後面,3台ap用odbc連線竟然只有一台連的到,還都在同網段。今天一不作二不休,就重灌成32bit的吧,果然就很順利了!! 想想可能是請廠商在裝os的時候,HP的導引光碟好像是拿成x86 32bit的...難怪裝好以後有幾樣裝置沒抓到,以後還是要多細心點,不要顧聊天 XD

2008年9月2日 星期二

SQL2005 tuning & testing

這幾天為了移轉一套sql2005所作的一些tuning,原來的server只有4GB Ram、2顆可憐的2.5" 10000轉 sas作raid1,整個系統慢到不行,這次移轉的新server(HP DL385G2)把Ram加到8GB,4顆sas作0+1...(當初採購時不知道廠商配Smart Array E200,連Raid5都沒有!! 硬碟也買太少),軟體裝standard win2003 x64+SQL2005 x64,希望效能會變好。 後來閒逛到介紹iometer的網頁,趁系統還沒上線來測看看IOPS...
想到上次去恆逸上課老師說SQL應該作磁碟重組,google找到一套IObit SmartDefrag,可以在win2003跑,還是免費軟體,等上線看看效能是否有提昇。

Server規格:
HP DL385G2 (AMD Opteron 1.8Ghz*2 / 4GB Ram)
IBM X3650 (Intel Xeon 2.0Ghz*2 / 4GB Ram / 3.5" 15000轉 sas*2)
DELL 6850 (Intel Xeon 2.6Ghz*4(4核) / 8GB Ram / 3.5" 15000轉 scsi*2)



Raid Controller:
HP Smart Array E200: 64MB cache, support raid 0/1/1+0
HP Smart Array P400: 256MB cache(大4倍!!), support raid 0/1/1+0/5/6
IBM ServerRAID 8K: 256MB cache, support raid 0/1/1+0/5/6
Dell PERC5/i: 256MB cache, support raid 0/1/1+0/5/6

測試參數:

  • Worker:4 (測dell 6850開到16)

  • Maximum Disk Size: 20000000 sectors(*512Bytes = 1GB)

  • # of Outstanding IO: 10 (值太小灌不滿效能)

  • Transfer Request Size: 8KB

  • Percent Read/Write Distribution: 33% Write, 67% Write, 100% Random

  • Run Time: 1 mins

  • Ramp Up Time:10 secs


接下來要PK大亂鬥啦:


E200,4顆硬碟作1+0,配置在2個channel


E200,2顆硬碟作1+0,配置在1個channel


P400,2顆硬碟作1+0,配置在2個channel


IBM,2顆硬碟作1+0,配置在1個channel



Dell,2顆硬碟作1+0,配置在1個channel

結論:

  • 作Raid1/1+0,raid controller的cache大小似乎影響不大,看P400跟E200數據差不多,E200不能作raid5,成本大概低很多(以後開規格要小心!!!)。(某論壇網友評語: E200是一塊半殘卡,LSI 1068E的,不帶處理器,做R0,R1凑和...)
  • Dell這張卡還滿多人用的樣子,不過測出來不怎麼樣,也許跟硬碟比較舊有關。
  • IBM還真是強啊!! HP用4顆作0+1都輸了。
  • 以上都是亂測,平台規格也不一致,只是參考用囉! 不過至少新的配置效能是有提昇的

    #iometer簡介#
    Iometer是目前業界量測儲存系統I/O效能的標準工具,可藉由負載產生器(Workers)的參數調整,透過測試元件產生不同區塊大小的輸入輸出請求與讀取/寫入的分布比例,模擬網路伺服器、檔案伺服器以及線上交易資料庫的讀寫行為。 由測試得出系統的最大I/O處理能力、傳輸速率與CPU占用率,使用者即可評估在不同應用環境下,伺服器儲存系統或是外接儲存設備的性能。
    Iometer本身是一套開放原始碼軟體,最新的版本為2006.07.27,可支援Windows、Linux、Solaris與Mac OS X等平臺。
    Iometer重要參數:Iometer內可調節的參數相當多,我們從一般效能測試中常用的一些參數,逐一簡單說明。

  • Worker:設定每個磁碟同時執行的執行緒(thread)數目。對一些高性能伺服器或企業級儲存設備,必須增加Worker數目,才能測得最大的效能。

  • # of Outstanding IO:設定每個磁碟同時發起I/O的數量,若是模擬串流檔案的播放或類似環境,可用預設值1。若要模擬同時有多個應用程式發出存取需求的環境,可依不同狀況設定。不過如果設太大的話,系統很可能會當機。

  • Transfer Request Size:每個I/O存取需求的Bytes大小,要測試系統最大I/O處理能力可設為512Bytes,要測試最大傳輸能力(MB/s)可設為128kB到512kB。

  • Percent Read/Write Distribution:讀取/寫入比例,模擬一般應用程式存取可設為50%讀+50%寫,或60%讀+40%寫;若要模擬備份寫入行為,可設為100%寫入;若要模擬還原動作,可設為100%讀取。若要讓GbE這類全雙工通道發揮最大效率,可設為50%讀+50%寫,以便啟動雙向傳輸。

  • Percent Random/Sequential Distribution:隨機/循序存取比例,若要模擬多媒體串流檔案播放,或是大量連續資料的備份/還原,可設為100%循序存取;若要模擬高交易資料庫,可設為100%隨機存取。

  • Run Time:測試執行時間,一般設為30到60秒。

  • Ramp Up Time:在測試某些擁有大量快取記憶體的系統時,為避免系統剛開始測試時一些異常或不穩定的數值,影響測試統計結果,可設定15到60秒的Ramp Up時間,等待系統進入穩定後再錄取測試數值。