sybase開發參考

2023-01-20 19:54:03 字數 3941 閱讀 8572

目錄 2

1 概述 3

2 tsql開發參考 3

2.1 提高查詢語句的效能 3

2.1.1 編寫符合sargs規範的查詢語句 3

2.1.2 建立有效的索引 4

2.2 提高併發效能 5

2.3 實現分頁查詢 5

2.4 使用tempdb存放臨時資料 6

2.5 選擇合適的鎖機制 6

3 esql/c開發參考 7

3.1 編譯引數 7

3.2 如何宣告動態分配記憶體的host variable 7

3.3 使用動態語句提高效能 8

3.4 多執行緒支援 8

4 jdbc開發參考 8

4.1 中文支援 8

4.2 連線屬性dynamic_prepare 9

本文適用於使用sybase adaptive server enterprise 12.5.3以上版本的使用者,針對資料庫開發中常見的問題,按照程式語言類別進行分類,提供了相應的解決方案或優化指導。

目前分為tsql,esql/c,jdbc三部分。其中tsql是ase資料庫開發的基礎和重點,其餘嵌入式sql的開發,都可以借鑑tsql優化的內容。

sql (結構化查詢語言)是在關係資料庫系統中使用的高階語言。sql 最初由 ibm 的 san jose research laboratory 在二十世紀七十年代末開發成功,現經改編後已用於很多關聯式資料庫管理系統。美國國家標準協會 (ansi) 和國際標準化組織 (iso) 已將其批准為正式關係查詢語言標準。

tsql (transact-sql) 是 sybase 的 sql 擴充套件,它與 ibm sql 和 sql 的大多數其它商業實施相容。它提供重要的額外功能和函式,如彙總計算、儲存過程(預定義的 sql 語句)和錯誤處理。

tsql 不僅包括用於查詢資料庫(從資料庫中檢索資料)的命令,也包括用於建立新資料庫和資料庫物件、新增新資料、修改現有資料的命令,還包括其它函式。

80%的資料庫效能問題是由於不好的查詢語句引起的。好的查詢語句的定義是查詢優化器在最少的時間內選擇了開銷最少的查詢計畫。在程式開發階段就應該注意正確書寫查詢語句和建立有效的索引,以獲得最優的查詢效能。

使用sargs(查詢引數)規範的目的是保證查詢優化器(optimizer)選取正確的索引,在應用邏輯許可的情況下應盡可能使用sargs規範。sargs是針對where表示式的書寫規範,格式如下:

where [column][operator][expression]

例:select au_lname, au_fname, phone

from authors where au_lname = "易中天"

sargs規範定義:

column: 1. column是已被索引的字段

2. column部分不應出現函式操作或算術操作

3.如索引是組合索引,但where語句中只使用其中乙個字段,

則該字段應是組合索引的首字段

operator: 運算子屬於 =, >, <, >=, <=, !>, !<, <>, !=, is null

expression: 與column資料型別相同的常數值

例:以下查詢條件符合sargs規範:

au_lname = "gerber"

price > 3000

price > 3 * 12

price = 25 and advance > 5000

以下查詢條件不符合sargs規範:

au_lname = au_fname (運算子右邊不是常數)

substring(au_lname, 1,3) = "ger" (運算子左邊包含函式操作)

price * 3 > 3000運算子左邊包含算術符號)

price != 3 * 12不是有效的sargs 運算子)

price = 25 or advance > 5000 (運算子or被使用)

int_col > 1.2資料型別不匹配)

對於不符合sargs的where語句,查詢優化器會做內部優化,使之轉為等價的sargs格式。但更好的做法是在程式設計時就盡量使用sargs規範,以節省查詢優化器的開銷,並確保正確的索引被使用。

聯機交易系統的乙個表上索引的總個數建議不要超過4個

決策支援系統(資料更新不頻繁,主要是查詢操作)可以建立較多的索引。

索引主要是為查詢服務的,因此建議不要把聚簇索引建立在id列上

在建立組合索引時,把查詢語句中使用最頻繁的列做為首列。

在建立組合索引時,不要包含太多的字段

當索引為組合索引時,首列必須包含在where語句當中

如優化器無法正確使用索引時可以考慮使用強制索引

ase15中可以考慮建立函式索引解決運算子左邊包含函式操作的情況

不建議對4個以上的表做連線

1. 使事務盡量短小

2. 對事務進行評估,使用盡可能少的鎖

3. 增加索引,避免表掃瞄

4. 對於熱點表使用行級鎖,減少競爭

5. 對於熱點表建立命名快取

6. 從開發層面避免產生死鎖

產生死鎖的典型情況是併發高峰不同事物表操作的順序不一致

例如 a事務 update table_1 ==> update table_2

b事務 update table_2 ==> update table_1

這種操作順序在併發壓力比較大的情況下就容易出現死鎖.

建議在業務邏輯滿足的情況下,盡量調整表操作順序一致.

7. 關注事務隔離級別(0-3),隔離級別越高,併發效能越低。

ase的事務隔離級別預設是 1。

8. 併發壓力測試時,使用sp_object_stats監控競爭狀況。

1. 建立splitpage儲存過程

create procedure splitpage @qry varchar(16384),@ipage int, @num int as

/*@qry sql語句, @ipage 頁數, @num 每頁記錄條數*/

begin

declare @rcount int

declare @execsql varchar(16384)

select @rcount=@ipage*@num

set rowcount @rcount

set @execsql = stuff(@qry,charindex('select',@qry),6,'select sybid=identity(12),')

set @execsql = stuff(@execsql, charindex('from',@execsql),4,'into #temptable1 from')

set @execsql = @execsql || ' select * from #temptable1 where sybid>' || convert(varchar,(@ipage-1)*@num) || ' and sybid <= ' || convert(varchar,@ipage*@num)

execute (@execsql)

set rowcount 0

end2. 使用splitpage進行分頁查詢

例如:取table_customer第11行到第20行顯示(即第二頁,每頁10行)

splitpage "select * from table_custormer order by col1", 2 , 10

在程式開發中,經常發現有程式設計師使用使用者庫中的一些永久表來存放臨時資料,經計算後最終結果插入其他使用者表,然後臨時資料被刪除。這類操作非常頻繁,會產生以下影響:

1.容易產生熱點表

2.永久表頻繁寫入/刪除,易產生資料碎片,影響讀寫效能

3.產生無謂的日誌開銷,增加日誌裝置負擔

4.執行效率低。

對於這類操作,建議將臨時資料放在在臨時庫tempdb的臨時表上,以獲得最佳效能,即不要在使用者庫上使用永久表的形式存放臨時資料。

SYBASE資料庫學習筆記

sybase菜鳥學習筆記 sybase版本 ase 12.5.4 中文版 1 無法load資料庫,提示can t open a connection to site syb backup 問題產生原因 1 sybase資料庫備份伺服器沒有啟動 2 當使用backup server做dump load...

技術開發委託合同參考

合同編號 專案名稱 委託方 甲方 受託方 乙方 簽訂時間 2014年4月20日 簽訂地點 嘉興 有效期限 2015年4月20日 技術開發 委託 合同 委託方 甲方 住所地法定代表人 專案聯絡人 通訊位址 傳真 電子信箱 受託方 乙方 住所地法定代表人 專案聯絡人 通訊位址 傳真 電子信箱 本合同甲方...

區域市場開發計畫書參考

區域市場開發計畫書參考美容行業市場總監省級市場開發計畫書範本 2008年度江蘇省市場工作計畫 序言 目前江蘇省的市場狀況,經過近兩個月的拜訪 溝通及客戶和市場反饋的情況,經過分析和整理 主要從以下幾個方面表現 上篇 市場概論 一 市場格局基礎概念 江蘇的的市場分布很有特點,市場差異化很大,區域的不同...