1、sp_configure 'number of user connections',500
修改最大連接數為500
2、sp_configure "number of devices"
查詢設備數
sp_configure 'number of devices',100
修改設備數為100
3、缺省緩存分配頁大小
sp_poolconfig 'default data cache','200M','16K'
4、最大索引
sp_configure 'number of open index',10000
5、最大鎖數
sp_configure 'number of locks',100000
6、缺省緩存分配頁大小
sp_poolconfig 'default data cache','200M','16K'
7、配置最大內存數
sp_configure 'max memory' ,2097151
以上是常用的一些,在CNDS中見到一個寫得非常好非常全的,為以下內容(如有興趣可以參考看看):
Sybase配置參數
select dbid, name,segmap
from sysusages, sysdevices
where sysdevices.low <= sysusages.size +vstart
and sysdevices.high >=sysusages.size+vstart -1
and dbid =2
and (status=2 or status=3)
go
sp_configure 'max online engines',4
go
--配置啟動cpu個數
sp_configure 'number of engines at startup',4
go
--配置最大內存數
sp_configure 'max memory' ,2097151
go
--分配最大存儲過程緩存
sp_configure 'procedure cache',102400
go
--配置高速緩存
sp_cacheconfig 'default data cache' , '700M'
go
--缺省緩存分配頁大小
sp_poolconfig 'default data cache','200M','16K'
go
--網絡包大小
sp_configure 'max network packet size',1024
go
go
--配置啟動cpu個數
sp_configure 'number of engines at startup',4
go
--配置最大內存數
sp_configure 'max memory' ,2097151
go
--分配最大存儲過程緩存
sp_configure 'procedure cache',102400
go
--配置高速緩存
sp_cacheconfig 'default data cache' , '700M'
go
--缺省緩存分配頁大小
sp_poolconfig 'default data cache','200M','16K'
go
--網絡包大小
sp_configure 'max network packet size',1024
go
--最大連接數
sp_configure 'number of user connections',500
go
--最大打開對象
sp_configure 'number of open object',9000
go
--最大索引
sp_configure 'number of open index',10000
go
--最大鎖數
sp_configure 'number of locks',100000
go
sp_configure 'number of user connections',500
go
--最大打開對象
sp_configure 'number of open object',9000
go
--最大索引
sp_configure 'number of open index',10000
go
--最大鎖數
sp_configure 'number of locks',100000
go
--增加網絡內存
--sp_configure 'additional network memory',1024
go
--sp_configure 'additional network memory',1024
go
--鎖內存
sp_configure 'lock shared memory',512
go
sp_configure 'lock shared memory',512
go
--優化tempdb
select dbid, name,segmap
from sysusages, sysdevices
where sysdevices.low <= sysusages.size +vstart
and sysdevices.high >=sysusages.size+vstart -1
and dbid =2
and (status=2 or status=3)
go
use tempdb
go
sp_dropsegment 'default',tempdb,master
go
sp_dropsegment 'logsegment',tempdb,master
go
select dbid, name,segmap
from sysusages, sysdevices
where sysdevices.low <= sysusages.size +vstart
and sysdevices.high >=sysusages.size+vstart -1
and dbid =2
and (status=2 or status=3)
go
use tempdb
go
sp_dropsegment 'default',tempdb,master
go
sp_dropsegment 'logsegment',tempdb,master
go
select dbid, name,segmap
from sysusages, sysdevices
where sysdevices.low <= sysusages.size +vstart
and sysdevices.high >=sysusages.size+vstart -1
and dbid =2
and (status=2 or status=3)
go
sp_cacheconfig tempdb_cache, '100M'
go
sp_poolconfig tempdb_cache,'50M','16K'
go
sp_bindcache 'tempdb_cache',tempdb
go
sp_helpcache tempdb_cache
go
sp_poolconfig tempdb_cache,'50M','16K'
go
sp_bindcache 'tempdb_cache',tempdb
go
sp_helpcache tempdb_cache
select name,id from syscharsets
dbcc traceon(3604)
dbcc memusage
dbcc memusage
1 數據庫安裝的優化
1.1 應用數據庫使用裸設備
若在UNIX(UNIXWARE)操 作系統下安裝數據庫服務器,請將SYBASE應用數據庫的設備(device)安裝成裸設備。即在創建應用數據庫設備 (如:IVSP,DB160,NAP2000等)時用裸設備,把文件名指向 /dev/dsk/ 子目錄下的相應文件。系統數據庫設備(如:master等)仍然指向文件系統。
1.2 補丁程序
完成SYBASE數據庫的安裝,請注意原版的SYBASE軟件都會帶有最新的補丁,一定要把補丁打上,否則會出現一些莫名其妙的問題。FOR NT 版的補丁是一個ZIP文件,解壓至C:/SYBASE子目錄即可。
1.3 安裝 SYBASE 在線幫助
在安裝好 SYBASE 后,在安裝目錄下有一文件:../scripts/ins_syn_sql,在服務器上執行該腳本:
Sybase for Unix版: ./isql -Usa -P -i../scripts/ins_syn_sql
Sybase for Winnt版: isql -Usa -P -i/sybase/scripts/ins_syn_sql
執行完畢后,即可在任意的 SYBASE 客戶端上連接上 SQL SERVER ,在線取得任意命令的幫助:
sp_syntax "關鍵字"
如: sp_syntax "alter" 即可列出所有包含"alter"字符的命令
2 數據庫配置的優化
2.1 優化master數據庫
首先加大master設備空間,初始默認為30M,加大為150M。然后加大master數據庫空間,默認數據段和日志段各為5M大小,建議改為數據段100M,日志段50M。
alter database master on master=95
2.2 優化tempdb數據庫
首先創建tempdb設備,分配給tempdb數據庫,默認tempdb數據庫數據段和日志段各為2M大小,並創建在master設備上,建議改為數據段200M,日志段50M,創建在tempdb設備上。
alter database tempdb on tempdb=200
1.1 應用數據庫使用裸設備
若在UNIX(UNIXWARE)操 作系統下安裝數據庫服務器,請將SYBASE應用數據庫的設備(device)安裝成裸設備。即在創建應用數據庫設備 (如:IVSP,DB160,NAP2000等)時用裸設備,把文件名指向 /dev/dsk/ 子目錄下的相應文件。系統數據庫設備(如:master等)仍然指向文件系統。
1.2 補丁程序
完成SYBASE數據庫的安裝,請注意原版的SYBASE軟件都會帶有最新的補丁,一定要把補丁打上,否則會出現一些莫名其妙的問題。FOR NT 版的補丁是一個ZIP文件,解壓至C:/SYBASE子目錄即可。
1.3 安裝 SYBASE 在線幫助
在安裝好 SYBASE 后,在安裝目錄下有一文件:../scripts/ins_syn_sql,在服務器上執行該腳本:
Sybase for Unix版: ./isql -Usa -P -i../scripts/ins_syn_sql
Sybase for Winnt版: isql -Usa -P -i/sybase/scripts/ins_syn_sql
執行完畢后,即可在任意的 SYBASE 客戶端上連接上 SQL SERVER ,在線取得任意命令的幫助:
sp_syntax "關鍵字"
如: sp_syntax "alter" 即可列出所有包含"alter"字符的命令
2 數據庫配置的優化
2.1 優化master數據庫
首先加大master設備空間,初始默認為30M,加大為150M。然后加大master數據庫空間,默認數據段和日志段各為5M大小,建議改為數據段100M,日志段50M。
alter database master on master=95
2.2 優化tempdb數據庫
首先創建tempdb設備,分配給tempdb數據庫,默認tempdb數據庫數據段和日志段各為2M大小,並創建在master設備上,建議改為數據段200M,日志段50M,創建在tempdb設備上。
alter database tempdb on tempdb=200
SQL SEVRER所有用戶都共享工作表和臨時表的tempdb數據庫,tempdb主要瓶頸是磁盤I/0。解決辦法是把tempdb放在更快的設備上。在 UNIX環境中,把tempdb放在文件系統中而不用原始的設備。由於tempdb在創建數據時,自動在master設備上創建為2M的數據庫,為了減少 沖突,最好的辦法是把tempdb從master設備中移走。為了達到上述目的,可采用如下辦法實現:
1:在單用戶狀態下啟動SQL SERVER
啟動單用戶方法:dataserver -dmaster.dat -m
2:以sa登錄
3:在文件系統中創建一個啞數據庫。
4:刪除sysusages和 sysdatabase表中對現有tempdb數據庫的引用
5:獲取啞數據庫的數據庫ID,相應修改sysusages和 ysdatabase表對tempdb的引用
6:重新啟動數據庫
以在newdevice中創建200M的tempdb數據庫為例,執行過程如下:
create database newtemp on newdevice=200
go /* 創建新的數據庫 */
begin tran
go /* 開始事務,防止操作錯誤時破壞整個SQL SERVER的運行*/
delete sysusages where dbid = 2
delete sysdatabases where dbid = 2
go /*刪除系統表對tempdb的引用,只能在單用戶狀態下執行*/
select dbid from sysdatabases where name = ‘newtemp’
啟動單用戶方法:dataserver -dmaster.dat -m
2:以sa登錄
3:在文件系統中創建一個啞數據庫。
4:刪除sysusages和 sysdatabase表中對現有tempdb數據庫的引用
5:獲取啞數據庫的數據庫ID,相應修改sysusages和 ysdatabase表對tempdb的引用
6:重新啟動數據庫
以在newdevice中創建200M的tempdb數據庫為例,執行過程如下:
create database newtemp on newdevice=200
go /* 創建新的數據庫 */
begin tran
go /* 開始事務,防止操作錯誤時破壞整個SQL SERVER的運行*/
delete sysusages where dbid = 2
delete sysdatabases where dbid = 2
go /*刪除系統表對tempdb的引用,只能在單用戶狀態下執行*/
select dbid from sysdatabases where name = ‘newtemp’
go /*獲取newtemp數據庫ID,假定為10*/
update sysusages set dbid = 2 where dbid=10
update sysdatabases set name=’tempdb’,dbid=2 where name=’newtemp’
go /*修改數據庫的引用,對newtemp的引用改為對tempdb的引用*/
select name,dbid, from sysdatabases where name = ‘tempdb’
select * from sysusages where dbid = 2
go /*測試修改是否正確,正確則提交,否則可用rollback回退*/
commit tran
go /*修改成功,重新啟動系統*/
這種方法只對tempdb有效,其他數據庫不能采用這種方法。因為在SQL SERVER啟動時,tempdb每次都重新初始化。
2.3 優化系統參數
以下參數為標准建議值,可根據實際情況修改。
優化系統參數的SQL腳本 注釋
sp_configure 'total memory', 100000 優化數據庫的內存,應根據不同機器配置設置, 建議為一半的物理內存大小。以db_block為單位,即每個單位為2k,上例為200M,默認為24M.
sp_configure "lock scheme" , 1,"datarows" 系統默認為表級鎖,優化為行鎖
sp_configure "number of locks" , 10000 加大最大鎖進程數, 默認為5000。
(如果設置一個已經存在的表(tabel)的鎖方式為行鎖,則執行:
alter table table_name lock datarows)
sp_configure 'procedure cache percent' ,30 缺省值:20 建議值:procedure使用頻率高時采用較大的值,不超過30
sp_configure "number of user connections",100 最大用戶連接數,默認為25,每個連接要占70k內存
sp_configure 'number of devices',20 將最大設備文件數據改為15個
sp_configure ‘number of Open databases’,20 最大打開數據庫個數,對於需在一台數據庫服務上打個多個數據庫則需加大此參數,默認為15
Sp_configure ‘max online engines CPU’,2 缺省值:1 建議值:采用實際機器的CPU個數
Sp_configure ‘total data cache size’,60000 缺省值:0 建議值:使用SQL SERVER內存的30%
如果上述參數改動后SYBASE啟動不正常,則可檢查SYBASE的錯誤日志,把SYBASE.cfg中的相應選項修改為較小的值。
附:SYBASE SQL SERVER 內存的分配
1. SQL SERVER 可執行代碼 3-4M
2. SQL SERVER 使用的靜態內存 2.2-3.25M
3. 用戶可配置的參數所占用內存,以下示例(11.9.2版):
默認值 占用內存
用戶連接數(user connections) 25 每個 約70k
打開的數據庫數(open database) 12 每個 約60k
打開的對象數(open objects) 500 每個 約1k
打開的索引數(open indexs) 500 每個 約1k
鎖數目(locks) 5000 每個 約0.1k
數據庫設備數(data device) 10 每個 約0.5k
4. 剩余部份分配給
過程緩存 ( 由 procedure cache percent 決定,默認值為 20% )
數據緩存 ( 默認值為減去1、2、3項的 80% )
2.4 優化數據庫系統屬性
在sybase center中選擇數據庫屬性,將屬性中options選項中的下列項目選中。
allow select into/bulk copy
truncate log on checkpoint
checkpoint on recovery
abort transction on full log
free space accounting
allow nulls by default
auto identity column in non-unquie index
方法二:在SQLPLUS中執行下列SQL腳本
如:
sp_dboption mydb,"abort tran on log full",true(設定當數據庫的日志空間滿時,就終止該進程,使用 sa 用戶)
sp_dboption mydb," select into/bulkcopy ",true
sp_dboption mydb," trunc log on chkpt ",true
sp_dboption mydb," no chkpt on recovery",true
sp_dboption mydb," no free space acctg ",true
sp_dboption mydb,"allow nulls by default",true
sp_dboption mydb," auto identity dbo use only ",true
2.5 創建閾值存儲過程
可根據不同的應用修改以下腳本或創建多個閾值存儲過程,並在配置閾值時指定相應的存儲過程。
create procedure sp_thresholdaction
@dbname varchar(30),@segmentname varchar(30), @free_space int,@status int
as dump transaction @dbname with no_log
print "LOG DUMP: '%1!' for '%2!' dumped",@segmentname,@dbname
go
2.6 配置多個閾值
方法一:
打開 Sybase Central,雙擊相應數據庫(database)的段 Segments ->; logsegment,在 Thresholds 頁面中可設置自動清除日志的閥值。其中有 Last Chance 的一行是系統默認的最后機會閥值,即系統日志空閑空間小於該值時為最后一次自動清除日志的機會。設置時閥值的大小可設為日志總空間大小的20%左右。
另外再增加多個閾值。
方法二:
1、使用如下指令查出數據庫中日志的容量(用頁表示)
select sum(size) from master..sysusages where dbid=db_id("database_name" and (segmap&4)=4
2、使用sp_addthreshold增加新的閾值,大小為日志容量的50%,如上面語句顯示值為2048
sp_addthreshold database_name,logsegment,1024,proc_dump_display
注意:因一個大事務時可能會越過當前的threshold,所以必須加多個threshold,
使用命令select @@thresh_hysteresis查看數據庫的滯后值,如結果為64頁,則下一個閾值設為"最近的閾值-(2*64)",請在所設閾值再按這種原則各增加兩個更小的閾值。
3 索引的優化
在良好的數據庫設計基礎上,需高效地使用索引,並經常的維護索引,下文介紹關於索引的相關內容。
3.1 創建索引
索引分為三類:聚簇索引(clustered indexes)、非聚簇索引(nonclustered indexes)、覆蓋索引(covering indexes)
鑒於索引加快了查詢速度,但減慢了數據更新速度的特點。可通過在一個段上建表,而在另一個段上建其非聚簇索引,而這兩段分別在單獨的物理設備上來改善操作性能。
create [unique][clustered|nonclustered] index index_name on table_name(column_name...)
3.2 重建索引
隨着數據行的插入、刪除和數據頁的分裂,有些索引頁可能只包含幾頁數據,另外應用在執行大塊I/O的時候,重建非聚簇索引可以降低分片,維護大塊I/O的效率。重建索引實際上是重新組織B-樹空間。在下面情況下需要重建索引:
(1)、數據和使用模式大幅度變化。
(2)、排序的順序發生改變。
(3)、要進行大量插入操作或已經完成。
(4)、使用大塊I/O的查詢的磁盤讀次數比預料的要多。
(5)、由於大量數據修改,使得數據頁和索引頁沒有充分使用而導致空間的使用超出估算。
(6)、dbcc檢查出索引有問題。
當重建聚簇索引時,這張表的所有非聚簇索引將被重建.
3.3 索引統計信息的更新
當在一個包含數據的表上創建索引的時候,SQL Server會創建分布數據頁來存放有關索引的兩種統計信息:分布表和密度表。優化器利用這個頁來判斷該索引對某個特定查詢是否有用。但這個統計信息並不 動態地重新計算。這意味着,當表的數據改變之后,統計信息有可能是過時的,從而影響優化器追求最有工作的目標。因此,在下面情況下應該運行update statistics命令:
(1)、數據行的插入和刪除修改了數據的分布。
(2)、對用truncate table刪除數據的表上增加數據行。
(3)、修改索引列的值。
4 查詢優化
4.1 NOT IN子句
不知大家是否喜歡使用‘NOT IN’這樣的操作,如果是,那盡量使用(NOT) EXISTS 替代。
例子:
語句1
SELECT dname, deptno FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp);
語句2
SELECT dname, deptno FROM dept WHERE NOT EXISTS (SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
明顯的,2要比1的執行性能好很多,因為1中對emp進行了full table scan,這是很浪費時間的操作。而且1中沒有用到emp的index,因為沒有where子句。而2中的語句對emp進行的是range scan。
4.2 海量查詢
在海量查詢時盡量少用格式轉換。
如用
WHERE a.order_no = b.order_no
而不用
WHERE TO_NUMBER (substr(a.order_no, instr(b.order_no, '.') - 1)= TO_NUMBER (substr(a.order_no, instr(b.order_no, '.') - 1)
3)查詢海量數據是可以使用optimizer hints,例如/*+ORDERED */
如
SELECT /*+ FULL(EMP) */ E.ENAME FROM EMP E WHERE E.JOB = 'CLERK';
而不是
SELECT E.ENAME FROM EMP E WHERE E.JOB || '' = 'CLERK';
2.3 優化系統參數
以下參數為標准建議值,可根據實際情況修改。
優化系統參數的SQL腳本 注釋
sp_configure 'total memory', 100000 優化數據庫的內存,應根據不同機器配置設置, 建議為一半的物理內存大小。以db_block為單位,即每個單位為2k,上例為200M,默認為24M.
sp_configure "lock scheme" , 1,"datarows" 系統默認為表級鎖,優化為行鎖
sp_configure "number of locks" , 10000 加大最大鎖進程數, 默認為5000。
(如果設置一個已經存在的表(tabel)的鎖方式為行鎖,則執行:
alter table table_name lock datarows)
sp_configure 'procedure cache percent' ,30 缺省值:20 建議值:procedure使用頻率高時采用較大的值,不超過30
sp_configure "number of user connections",100 最大用戶連接數,默認為25,每個連接要占70k內存
sp_configure 'number of devices',20 將最大設備文件數據改為15個
sp_configure ‘number of Open databases’,20 最大打開數據庫個數,對於需在一台數據庫服務上打個多個數據庫則需加大此參數,默認為15
Sp_configure ‘max online engines CPU’,2 缺省值:1 建議值:采用實際機器的CPU個數
Sp_configure ‘total data cache size’,60000 缺省值:0 建議值:使用SQL SERVER內存的30%
如果上述參數改動后SYBASE啟動不正常,則可檢查SYBASE的錯誤日志,把SYBASE.cfg中的相應選項修改為較小的值。
附:SYBASE SQL SERVER 內存的分配
1. SQL SERVER 可執行代碼 3-4M
2. SQL SERVER 使用的靜態內存 2.2-3.25M
3. 用戶可配置的參數所占用內存,以下示例(11.9.2版):
默認值 占用內存
用戶連接數(user connections) 25 每個 約70k
打開的數據庫數(open database) 12 每個 約60k
打開的對象數(open objects) 500 每個 約1k
打開的索引數(open indexs) 500 每個 約1k
鎖數目(locks) 5000 每個 約0.1k
數據庫設備數(data device) 10 每個 約0.5k
4. 剩余部份分配給
過程緩存 ( 由 procedure cache percent 決定,默認值為 20% )
數據緩存 ( 默認值為減去1、2、3項的 80% )
2.4 優化數據庫系統屬性
在sybase center中選擇數據庫屬性,將屬性中options選項中的下列項目選中。
allow select into/bulk copy
truncate log on checkpoint
checkpoint on recovery
abort transction on full log
free space accounting
allow nulls by default
auto identity column in non-unquie index
方法二:在SQLPLUS中執行下列SQL腳本
如:
sp_dboption mydb,"abort tran on log full",true(設定當數據庫的日志空間滿時,就終止該進程,使用 sa 用戶)
sp_dboption mydb," select into/bulkcopy ",true
sp_dboption mydb," trunc log on chkpt ",true
sp_dboption mydb," no chkpt on recovery",true
sp_dboption mydb," no free space acctg ",true
sp_dboption mydb,"allow nulls by default",true
sp_dboption mydb," auto identity dbo use only ",true
2.5 創建閾值存儲過程
可根據不同的應用修改以下腳本或創建多個閾值存儲過程,並在配置閾值時指定相應的存儲過程。
create procedure sp_thresholdaction
@dbname varchar(30),@segmentname varchar(30), @free_space int,@status int
as dump transaction @dbname with no_log
print "LOG DUMP: '%1!' for '%2!' dumped",@segmentname,@dbname
go
2.6 配置多個閾值
方法一:
打開 Sybase Central,雙擊相應數據庫(database)的段 Segments ->; logsegment,在 Thresholds 頁面中可設置自動清除日志的閥值。其中有 Last Chance 的一行是系統默認的最后機會閥值,即系統日志空閑空間小於該值時為最后一次自動清除日志的機會。設置時閥值的大小可設為日志總空間大小的20%左右。
另外再增加多個閾值。
方法二:
1、使用如下指令查出數據庫中日志的容量(用頁表示)
select sum(size) from master..sysusages where dbid=db_id("database_name" and (segmap&4)=4
2、使用sp_addthreshold增加新的閾值,大小為日志容量的50%,如上面語句顯示值為2048
sp_addthreshold database_name,logsegment,1024,proc_dump_display
注意:因一個大事務時可能會越過當前的threshold,所以必須加多個threshold,
使用命令select @@thresh_hysteresis查看數據庫的滯后值,如結果為64頁,則下一個閾值設為"最近的閾值-(2*64)",請在所設閾值再按這種原則各增加兩個更小的閾值。
3 索引的優化
在良好的數據庫設計基礎上,需高效地使用索引,並經常的維護索引,下文介紹關於索引的相關內容。
3.1 創建索引
索引分為三類:聚簇索引(clustered indexes)、非聚簇索引(nonclustered indexes)、覆蓋索引(covering indexes)
鑒於索引加快了查詢速度,但減慢了數據更新速度的特點。可通過在一個段上建表,而在另一個段上建其非聚簇索引,而這兩段分別在單獨的物理設備上來改善操作性能。
create [unique][clustered|nonclustered] index index_name on table_name(column_name...)
3.2 重建索引
隨着數據行的插入、刪除和數據頁的分裂,有些索引頁可能只包含幾頁數據,另外應用在執行大塊I/O的時候,重建非聚簇索引可以降低分片,維護大塊I/O的效率。重建索引實際上是重新組織B-樹空間。在下面情況下需要重建索引:
(1)、數據和使用模式大幅度變化。
(2)、排序的順序發生改變。
(3)、要進行大量插入操作或已經完成。
(4)、使用大塊I/O的查詢的磁盤讀次數比預料的要多。
(5)、由於大量數據修改,使得數據頁和索引頁沒有充分使用而導致空間的使用超出估算。
(6)、dbcc檢查出索引有問題。
當重建聚簇索引時,這張表的所有非聚簇索引將被重建.
3.3 索引統計信息的更新
當在一個包含數據的表上創建索引的時候,SQL Server會創建分布數據頁來存放有關索引的兩種統計信息:分布表和密度表。優化器利用這個頁來判斷該索引對某個特定查詢是否有用。但這個統計信息並不 動態地重新計算。這意味着,當表的數據改變之后,統計信息有可能是過時的,從而影響優化器追求最有工作的目標。因此,在下面情況下應該運行update statistics命令:
(1)、數據行的插入和刪除修改了數據的分布。
(2)、對用truncate table刪除數據的表上增加數據行。
(3)、修改索引列的值。
4 查詢優化
4.1 NOT IN子句
不知大家是否喜歡使用‘NOT IN’這樣的操作,如果是,那盡量使用(NOT) EXISTS 替代。
例子:
語句1
SELECT dname, deptno FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp);
語句2
SELECT dname, deptno FROM dept WHERE NOT EXISTS (SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
明顯的,2要比1的執行性能好很多,因為1中對emp進行了full table scan,這是很浪費時間的操作。而且1中沒有用到emp的index,因為沒有where子句。而2中的語句對emp進行的是range scan。
4.2 海量查詢
在海量查詢時盡量少用格式轉換。
如用
WHERE a.order_no = b.order_no
而不用
WHERE TO_NUMBER (substr(a.order_no, instr(b.order_no, '.') - 1)= TO_NUMBER (substr(a.order_no, instr(b.order_no, '.') - 1)
3)查詢海量數據是可以使用optimizer hints,例如/*+ORDERED */
如
SELECT /*+ FULL(EMP) */ E.ENAME FROM EMP E WHERE E.JOB = 'CLERK';
而不是
SELECT E.ENAME FROM EMP E WHERE E.JOB || '' = 'CLERK';
對於數據量較大和業務功能較復雜的系統,Sybase的默認參數根本無法滿足需要,必須進行優化。系統數據庫方面的優化從兩方面進行,一個是調 整數據庫系統的一些性能參數的值,另一個是應用程序的調優。應用程序的調優調整hsql和sql的寫法,配合sql合理的建索引,這里主要對Sybase 系統一些基本的性能參數的調優進行一個小結。
1、內存
內存是對性能影響最大,也是最需要也是最難調優的地方。內存調優一定要,常用的需要調整的參數有:
1、內存
內存是對性能影響最大,也是最需要也是最難調優的地方。內存調優一定要,常用的需要調整的參數有:
sp_configure “max memory”,0,”2600M” (設置為共享內存的75%,重啟生效)
sp_configure “allocate max shared mem”,1 (啟動的時候自動分配max memory指定的最大內存)
sp_cacheconfig “default data cache”,”1300m”(設置數據緩存為max memory的一半)
sp_cacheconfig “default data cache”,”cache_partition=2″
sp_configure “procedure cache size”,102400 (過程高速緩存,通常是max mem20%-30%,這里是200M,在大量的執行sql的時候這個參數一定要調大)
sp_cacheconfig ‘tempdb_cache’,'100m’,'mixed’ (創建一個100M命名高速緩存tempdb_cache給temdpb使用)
sp_bindcache ‘tempdb_cache’,tempdb (將tempdb_cache綁定到tempdb)
sp_configure “allocate max shared mem”,1 (啟動的時候自動分配max memory指定的最大內存)
sp_cacheconfig “default data cache”,”1300m”(設置數據緩存為max memory的一半)
sp_cacheconfig “default data cache”,”cache_partition=2″
sp_configure “procedure cache size”,102400 (過程高速緩存,通常是max mem20%-30%,這里是200M,在大量的執行sql的時候這個參數一定要調大)
sp_cacheconfig ‘tempdb_cache’,'100m’,'mixed’ (創建一個100M命名高速緩存tempdb_cache給temdpb使用)
sp_bindcache ‘tempdb_cache’,tempdb (將tempdb_cache綁定到tempdb)
實際中遇到一個很頭痛的問題, 32位Windows版本的Sybase 最大內存只能到搞到3G左右,"default data cache"的值超過 1500M Sybase實例就起不來了,導致服務器的16G內存形同虛設,所以如果大家的項目和我這個類似,服務器和操作系統由客戶提供,還換不了的,內存不妨要求 個4G就夠了,多了也浪費。
2、CPU
當服務器的CPU個數多於一個時,可以考慮多CPU。實際上對於OS會自動調度,設一下只不過是控制的更精確一點。實際需要根據CPU數來修改,若CPU=N,一般設置為N-1。設置這個參數,比如我的服務器8個CPU, 就像下面這樣設置:
當服務器的CPU個數多於一個時,可以考慮多CPU。實際上對於OS會自動調度,設一下只不過是控制的更精確一點。實際需要根據CPU數來修改,若CPU=N,一般設置為N-1。設置這個參數,比如我的服務器8個CPU, 就像下面這樣設置:
sp_configure “max online engines”,7
sp_configure “number of engines at startup”,7
sp_configure “max parallel degree”,1 (並行的度,大於或等於1)
sp_configure “number of worker processes”,7 (並行度*並發連接數*1.5倍)
sp_configure “number of engines at startup”,7
sp_configure “max parallel degree”,1 (並行的度,大於或等於1)
sp_configure “number of worker processes”,7 (並行度*並發連接數*1.5倍)
3、連接數(這個沒什么說的,數量管夠就可以,默認數為25,可根據應用需要來修改。)
sp_configure “number of user connections”,600
sp_configure “number of user connections”,600
查詢數據庫死進程
select * from master..syslogshold
select * from master..syslogshold
4、鎖
數據庫的鎖機制其實是一個比較復雜的話題,這里只能簡單說一下。Sybase數據庫系統兩個級別的鎖機制:所有頁鎖、數據頁鎖。所有頁鎖在當數據庫加鎖時,既鎖數據頁,也鎖索引頁;數據頁鎖當數據庫加鎖時,只鎖數據頁,不鎖索引頁。
Sybase支持三種類型的鎖: 數據表鎖、數據頁鎖、數據行鎖。 一些常用的調優命令和策略如下:
數據庫的鎖機制其實是一個比較復雜的話題,這里只能簡單說一下。Sybase數據庫系統兩個級別的鎖機制:所有頁鎖、數據頁鎖。所有頁鎖在當數據庫加鎖時,既鎖數據頁,也鎖索引頁;數據頁鎖當數據庫加鎖時,只鎖數據頁,不鎖索引頁。
Sybase支持三種類型的鎖: 數據表鎖、數據頁鎖、數據行鎖。 一些常用的調優命令和策略如下:
sp_configure "number of locks",50000 (設置鎖的數量)
系統設置時要把鎖的數量設大一點,簡單說就是要管夠;如果需要節省空間,減少維護量,使用所有頁鎖機制;而如果需要加快速度,空間足夠,使用數據頁鎖機制。
系統設置時要把鎖的數量設大一點,簡單說就是要管夠;如果需要節省空間,減少維護量,使用所有頁鎖機制;而如果需要加快速度,空間足夠,使用數據頁鎖機制。
sp_sysmon “00:10:00”,locks (檢測表的使用情況)
當通過監測發現鎖競爭超過15%時,首先修改加鎖最重的表的鎖機制,然后再把數據頁鎖設置為數據行鎖。如果發現螺旋鎖多,則為該表建立單獨的命名緩存並對命名緩存進行分區。
當通過監測發現鎖競爭超過15%時,首先修改加鎖最重的表的鎖機制,然后再把數據頁鎖設置為數據行鎖。如果發現螺旋鎖多,則為該表建立單獨的命名緩存並對命名緩存進行分區。
5、I/O
數據庫調優總的思路是盡量減少和分散物理I/O,盡量減少網絡I/O。
數據庫調優總的思路是盡量減少和分散物理I/O,盡量減少網絡I/O。
減少物理I/O的辦法有: 在命名緩存中增加大塊的I/O緩沖池,把數據分散到多個硬盤上,采用RAID技術,建立段,使一個表跨越多個硬盤等等,基本和其他的數據庫軟件調優一樣。
減少網絡I/O的辦法是采用大數據包。
sp_configure "default network packet size",2048 設置網絡傳送包的大小(需要重啟動)
sp_configure "max network packet size",2048
減少網絡I/O的辦法是采用大數據包。
sp_configure "default network packet size",2048 設置網絡傳送包的大小(需要重啟動)
sp_configure "max network packet size",2048
6、設備調整
主要調整兩塊: 一個是業務數據庫的數據設備與日志設備必須分開,添加臨時數據庫設備;另一個是調整Tempdb,這一條很重要卻很容易被大家忽視。
Tempdb是sybase數據庫當中的臨時庫,用於存放中間結果和臨時表。由於使用很頻繁而默認大小又很小,我們需要加大其設備空間和庫的大小,盡可能把tempdb放置到最快的硬盤上,並建立單獨的命名緩存。
sp_cacheconfig ‘tempdb_cache’,'200m’,'mixed’ (創建一個200M命名高速緩存tempdb_cache給temdpb使用)
sp_bindcache ‘tempdb_cache’,tempdb (將tempdb_cache綁定到tempdb)
主要調整兩塊: 一個是業務數據庫的數據設備與日志設備必須分開,添加臨時數據庫設備;另一個是調整Tempdb,這一條很重要卻很容易被大家忽視。
Tempdb是sybase數據庫當中的臨時庫,用於存放中間結果和臨時表。由於使用很頻繁而默認大小又很小,我們需要加大其設備空間和庫的大小,盡可能把tempdb放置到最快的硬盤上,並建立單獨的命名緩存。
sp_cacheconfig ‘tempdb_cache’,'200m’,'mixed’ (創建一個200M命名高速緩存tempdb_cache給temdpb使用)
sp_bindcache ‘tempdb_cache’,tempdb (將tempdb_cache綁定到tempdb)
