日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

sybase性能优化经验浅谈

發(fā)布時(shí)間:2024/4/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sybase性能优化经验浅谈 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://www.2cto.com/database/201204/129094.html

使用sybase數(shù)據(jù)庫(kù)多年,有些經(jīng)驗(yàn),在數(shù)據(jù)庫(kù)部署配置得當(dāng),平時(shí)監(jiān)控維護(hù)做到位情況下,除此之外數(shù)據(jù)庫(kù)的性能問題80%將會(huì)是由sql語(yǔ)句引起。

在編寫sql語(yǔ)句時(shí)候,個(gè)人經(jīng)驗(yàn),以下幾個(gè)問題中有大部分跟編寫sql有關(guān),必須引起重視。
經(jīng)驗(yàn)一、where 條件左邊最好不要使用函數(shù),比如: select ...???? where???? datediff(day,date_column,getdate())>0 這樣即使在date_column列上建立了索引,也可能不會(huì)使用索引,而使用全表掃描。 這樣的語(yǔ)句要重新規(guī)劃設(shè)計(jì),保證不使用函數(shù)也能夠?qū)崿F(xiàn)。通過修改,一個(gè)系統(tǒng)過程的運(yùn)行效率提高大約幾十倍甚至上百倍!此外不要使用諸如like '%ab',不能充分利用索引,而要在%前加字符。
經(jīng)驗(yàn)二、兩個(gè)比較字段最好使用相同數(shù)據(jù)類型,而不是兼容數(shù)據(jù)類型。比如 int 與 numeric(感覺一般不是太明顯)。? www.2cto.com?
經(jīng)驗(yàn)三、復(fù)合索引的非前導(dǎo)列做條件時(shí),基本沒有起到索引的作用。 比如 create index idx_tablename_ab on tablename(a,b) update tablename set c = XX where b>= XXX and ... 在這個(gè)語(yǔ)句中,只用了索引列b而沒用索引列a做查詢條件,基本上索引沒有發(fā)揮作用。 導(dǎo)致表掃描引起blocking 甚至運(yùn)行十幾分鐘后報(bào)告失敗。 一定要認(rèn)真檢查 改正措施: 在接口中附加條件 update tablename set c = XX? where? a = XXX? and b>= XXX 或者建立索引類似于 create index idx_tablename_ba on tablename(b,a)
經(jīng)驗(yàn)四、 多個(gè)大表的關(guān)聯(lián)查詢,如果性能不好,并且其中一個(gè)大表中取的數(shù)據(jù)比較少,可以考慮將查詢分兩步執(zhí)行。 先將一個(gè)大表中的少部分?jǐn)?shù)據(jù) select * into #tmp from large_table where ... 然后再用 #tmp 去做關(guān)聯(lián),效果可能會(huì)好不少。(前提:生成 #tmp表時(shí),訪問large_table 用到了比較好的索引,速度比較快)
經(jīng)驗(yàn)五、 tempdb 的使用。 最好多用 select? into ,這樣不記日志 ,尤其是有大量數(shù)據(jù)的報(bào)表時(shí)。雖然寫起來麻煩,但值得。 create table #tmp (......)這樣寫性能不好。尤其是大量使用時(shí),容易發(fā)生tempdb 爭(zhēng)用。
經(jīng)驗(yàn)六、 系統(tǒng)級(jí)別的參數(shù)設(shè)置???? 一定要估計(jì)一下,不要配置太多,占用資源 ,配置太少,發(fā)生性能問題。 連接數(shù),索引打開個(gè)數(shù)、鎖個(gè)數(shù) 等、 當(dāng)然 ,內(nèi)存配置不要有明顯的問題,比如,procedure cache 不夠 (一般缺省20%,如果覺得太多,可以減少一些)。如果做報(bào)表經(jīng)常使用大數(shù)據(jù)量讀,可以考慮使用? www.2cto.com?? 16K data cache
經(jīng)驗(yàn)七、索引的建立,很重要。 clustered index???? /nonclustered index 的差異,自己要搞清楚。各適用場(chǎng)合,另外如果 clustered index 不允許 重復(fù)數(shù),也一定要說明。 索引設(shè)計(jì)是以為數(shù)據(jù)訪問快速為原則的,不能 完全參照數(shù)據(jù)邏輯設(shè)計(jì)的,邏輯設(shè)計(jì)時(shí)的一些東西,可能對(duì)物理訪問不起作用 經(jīng)驗(yàn)八、定期統(tǒng)計(jì)量數(shù)據(jù)的更新,更新頻率看數(shù)據(jù)變化速度,一般數(shù)據(jù)發(fā)生10-15%左右變化就要進(jìn)行統(tǒng)計(jì)量的更新,否則索引容易失效,update statistics
經(jīng)驗(yàn)九、定期
經(jīng)驗(yàn)九、強(qiáng)制索引使用 如果懷疑有表訪問時(shí)不是使用索引,而且這些條件字段上建立了合適的索引,可以強(qiáng)制使用 select * from tableA (index idx_name) where ... 這個(gè)對(duì)一些報(bào)表程序可能比較有用。
經(jīng)驗(yàn)十、找一個(gè)好的監(jiān)視工具 工欲善其事,必先利其器,一點(diǎn)都不錯(cuò)呀。 我用 DBArtisan ,監(jiān)視哪些表被鎖定時(shí)間長(zhǎng), blocking 等 還有 sp_object_status 20:00:00 , sp_sysmon 20:00:00 等
經(jīng)驗(yàn)十一: 綜合以上對(duì)IN/EXISTS的討論,我們可以得出一個(gè)基本通用的結(jié)論:IN適合于外表大而內(nèi)表小的情況;EXISTS適合于外表小而內(nèi)表大的情況。 另外,系統(tǒng)中確認(rèn)不使用的中間數(shù)據(jù),可以進(jìn)行轉(zhuǎn)移。這些要看系統(tǒng)的情況哦 最后祝你好運(yùn)氣。? www.2cto.com? 以上為個(gè)人經(jīng)驗(yàn),歡迎批評(píng)指正!???? 呵呵 寫完后忘記一個(gè)???? 一定要注意熱點(diǎn)表 ,這是影響并發(fā)問題的一個(gè)潛在因素!

解決方法: 行鎖模式 如果表的行比較小,可以故意增加一些不用的字段 比如???? char(200)???? 讓一頁(yè)中存放的行不要太多。 Sybase 索引的使用和優(yōu)化詳解 ================================= http://database.9sssd.com/sybase/art/537

[摘要]采用索引來加快數(shù)據(jù)處理速度成為廣大數(shù)據(jù)庫(kù)用戶所接受的優(yōu)化方法,本文介紹Sybase 索引的使用和優(yōu)化。

在應(yīng)用系統(tǒng)中,尤其在聯(lián)機(jī)事務(wù)處理系統(tǒng)中,對(duì)數(shù)據(jù)查詢及處理速度已成為衡量應(yīng)用系統(tǒng)成敗的標(biāo)準(zhǔn)。而采用索引來加快數(shù)據(jù)處理速度也成為廣大數(shù)據(jù)庫(kù)用戶所接受的優(yōu)化方法。在良好的數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ)上,能有效地使用索引是SQLServer取得高性能的基礎(chǔ),SQLServer采用基于代價(jià)的優(yōu)化模型,它對(duì)每一個(gè)提交的有關(guān)表的查詢,決定是否使用索引或用哪一個(gè)索引。因?yàn)椴樵儓?zhí)行的大部分開銷是磁盤I/O,使用索引提高性能的一個(gè)主要目標(biāo)是避免全表掃描,因?yàn)槿頀呙栊枰獜拇疟P上讀表的每一個(gè)數(shù)據(jù)頁(yè),如果有索引指向數(shù)據(jù)值,則查詢只需讀幾次磁盤就可以了。所以如果建 立了合理的索引,優(yōu)化器就能利用索引加速數(shù)據(jù)的查詢過程。但是,索引并不總是提高系統(tǒng)的性能,在增、刪、改操作中索引的存在會(huì)增加一定的工作量,因此,在適當(dāng)?shù)牡胤皆黾舆m當(dāng)?shù)乃饕牟缓侠淼牡胤絼h除次優(yōu)的索引,將有助于優(yōu)化那些性能較差的SQLServer應(yīng)用。實(shí)踐表明,合理的索引設(shè)計(jì)是建立在對(duì)各種查詢的分析和預(yù)測(cè)上的,只有正確地使索引與程序結(jié)合起來,才能產(chǎn)生最佳的優(yōu)化方案。本文就SQLServer索引的性能問題進(jìn)行了一些分析和實(shí)踐。

一、聚簇索引(clusteredindexes)的使用 聚簇索引是一種對(duì)磁盤上實(shí)際數(shù)據(jù)重新組織以按指定的一個(gè)或多個(gè)列的值排序。由于聚簇索引的索引頁(yè)面指針指向數(shù)據(jù)頁(yè)面,所以使用聚簇索引查找數(shù)據(jù)幾乎總是比使用非聚簇索引快。每張表只能建一個(gè)聚簇索引,并且建聚簇索引需要至少相當(dāng)該表120%的附加空間,以存放該表的副本和索引中間頁(yè)。建立聚簇索引的思想 是:

1、大多數(shù)表都應(yīng)該有聚簇索引或使用分區(qū)來降低對(duì)表尾頁(yè)的競(jìng)爭(zhēng),在一個(gè)高事務(wù)的環(huán)境中,對(duì)最后一頁(yè)的封鎖嚴(yán)重影響系統(tǒng)的吞吐量。

2、在聚簇索引下,數(shù)據(jù)在物理上按順序排在數(shù)據(jù)頁(yè)上,重復(fù)值也排在一起,因而在那些包含范圍檢查(between、<、<=、>、>=)或使用group by或order by的查詢時(shí),一旦找到具有范圍中第一個(gè)鍵值的行,具有后續(xù)索引值的行保證物理上毗連在一起而不必進(jìn)一步搜索,避免了大范圍掃描,可以大大提高查詢速度。

3、在一個(gè)頻繁發(fā)生插入操作的表上建立聚簇索引時(shí),不要建在具有單調(diào)上升值的列(如IDENTITY)上,否則會(huì)經(jīng)常引起封鎖沖突。

4、在聚簇索引中不要包含經(jīng)常修改的列,因?yàn)榇a值修改后,數(shù)據(jù)行必須移動(dòng)到新的位置。

5、選擇聚簇索引應(yīng)基于where子句和連接操作的類型。

聚簇索引的侯選列是:

  • 主鍵列,該列在where子句中使用并且插入是隨機(jī)的。
  • 按范圍存取的列,如pri_order> 100 and pri_order < 200 。
  • 在group by或order by中使用的列。
  • 不經(jīng)常修改的列。
  • 在連接操作中使用的列。

二、非聚簇索引(nonclusteredindexes)的使用 SQL Server缺省情況下建立的索引是非聚簇索引,由于非聚簇索引不重新組織表中的數(shù)據(jù),而是對(duì)每一行存儲(chǔ)索引列值并用一個(gè)指針指向數(shù)據(jù)所在的頁(yè)面。換句話說非聚簇索引具有在索引結(jié)構(gòu)和數(shù)據(jù)本身之間的一個(gè)額外級(jí)。一個(gè)表如果沒有聚簇索引時(shí),可有250個(gè)非聚簇索引。每個(gè)非聚簇索引提供訪問數(shù)據(jù)的不同排序順 序。在建立非聚簇索引時(shí),要權(quán)衡索引對(duì)查詢速度的加快與降低修改速度之間的利弊。另外,還要考慮這些問題:

  • 索引需要使用多少空間。
  • 合適的列是否穩(wěn)定。
  • 索引鍵是如何選擇的,掃描效果是否更佳。
  • 是否有許多重復(fù)值。 對(duì)更新頻繁的表來說,表上的非聚簇索引比聚簇索引和根本沒有索引需要更多的額外開銷。移到新頁(yè)的每一行而言,指向該數(shù)據(jù)的每個(gè)非聚簇索引的頁(yè)級(jí)行也必須更新,有時(shí)可能還需要索引頁(yè)的分理。從一個(gè)頁(yè)面刪除數(shù)據(jù)的進(jìn)程也會(huì)有類似的開銷,另外,刪除進(jìn)程還必須把數(shù)據(jù)移到頁(yè)面上部,以保證數(shù)據(jù)的連續(xù)性。所以,建立非聚簇索引要非常慎重。

非聚簇索引常被用在以下情況:

  • 某列常用于集合函數(shù)(如Sum,....)。
  • 某列常用于join,orderby,group by。
  • 查尋出的數(shù)據(jù)不超過表中數(shù)據(jù)量的20%。

三、覆蓋索引(coveringindexes)的使用 覆蓋索引是指那些索引項(xiàng)中包含查尋所需要的全部信息的非聚簇索引,這種索引之所以比較快也正是因?yàn)樗饕?yè)中包含了查尋所必須的數(shù)據(jù),不需去訪 問數(shù)據(jù)頁(yè)。如果非聚簇索引中包含結(jié)果數(shù)據(jù),那么它的查詢速度將快于聚簇索引。但是由于覆蓋索引的索引項(xiàng)比較多,要占用比較大的空間。而且update操作會(huì)引起索引值改變。所以如果潛在的覆蓋查詢并不常用或不太關(guān)鍵,則覆蓋索引的增加反而會(huì)降低性能。

四、索引的選擇技術(shù) p_detail是住房公積金管理系統(tǒng)中記錄個(gè)人明細(xì)的表,有890000行,觀察在不同索引下的查詢運(yùn)行效果,測(cè)試在C/S環(huán)境下進(jìn)行,客戶機(jī)是IBM PII350(內(nèi)存64M),服務(wù)器是DECAlpha1000A(內(nèi)存128M),數(shù)據(jù)庫(kù)為SYBASE11.0.3。

1 2 3 select count(*) from p_detail where op_date>’19990101’ and op_date<’19991231’ and pri_surplus1>300 select count(*),sum(pri_surplus1) from p_detail where op_date>’19990101’ and pay_month between‘199908’ and ’199912’

不建任何索引 查詢1 1分15秒 查詢2 1分7秒

在op_date上建非聚簇索引 查詢1 57秒 查詢2 57秒

在op_date上建聚簇索引 查詢1 <1秒 查詢2 52秒

在pay_month、op_date、pri_surplus1上建索引 查詢1 34秒 查詢2 <1秒 在op_date、pay_month、pri_surplus1上建索引查詢1 <1秒 查詢2 <1秒 從以上查詢效果分析,索引的有無,建立方式的不同將會(huì)導(dǎo)致不同的查詢效果,選擇什么樣的索引基于用戶對(duì)數(shù)據(jù)的查詢條件,這些條件體現(xiàn)于where從句和 join表達(dá)式中。

一般來說建立索引的思路是:

(1)、主鍵時(shí)常作為where子句的條件,應(yīng)在表的主鍵列上建立聚簇索引,尤其當(dāng)經(jīng)常用它作為連接的時(shí)候。

(2)、有大量重復(fù)值且經(jīng)常有范圍查詢和排序、分組發(fā)生的列,或者非常頻繁地被訪問的列,可考慮建立聚簇索引。

(3)、經(jīng)常同時(shí)存取多列,且每列都含有重復(fù)值可考慮建立復(fù)合索引來覆蓋一個(gè)或一組查詢,并把查詢引用最頻繁的列作為前導(dǎo)列,如果可能盡量使關(guān)鍵查詢形成覆蓋查詢。

(4)、如果知道索引鍵的所有值都是唯一的,那么確保把索引定義成唯一索引。

(5)、在一個(gè)經(jīng)常做插入操作的表上建索引時(shí),使用fillfactor(填充因子)來減少頁(yè)分裂,同時(shí)提高并發(fā)度降低死鎖的發(fā)生。如果在只讀表上建索引,則可以把fillfactor置為100。

(6)、在選擇索引鍵時(shí),設(shè)法選擇那些采用小數(shù)據(jù)類型的列作為鍵以使每個(gè)索 引頁(yè)能夠容納盡可能多的索引鍵和指針,通過這種方式,可使一個(gè)查詢必須遍歷的索引頁(yè)面降到最小。此外,盡可能地使用整數(shù)為鍵值,因?yàn)樗軌蛱峁┍热魏螖?shù)據(jù)類型都快的訪問速度。

五、索引的維護(hù) 上面講到,某些不合適的索引影響到SQLServer的性能,隨著應(yīng)用系統(tǒng)的運(yùn)行,數(shù)據(jù)不斷地發(fā)生變化,當(dāng)數(shù)據(jù)變化達(dá)到某一個(gè)程度時(shí)將 會(huì)影響到索引的使用。這時(shí) 需要用戶自己來維護(hù)索引。索引的維護(hù)包括: 1、重建索引 隨著數(shù)據(jù)行的插入、刪除和數(shù)據(jù)頁(yè)的分裂,有些索引頁(yè)可能只包含幾頁(yè)數(shù)據(jù),另外應(yīng)用在執(zhí)行大塊I/O的時(shí)候,重建非聚簇索引可以降低分片,維護(hù)大塊I/O的效率。重建索引實(shí)際上是重新組織B-樹空間。在下面情況下需要重建索引:

(1)、數(shù)據(jù)和使用模式大幅度變化。

(2)、排序的順序發(fā)生改變。

(3)、要進(jìn)行大量插入操作或已經(jīng)完成。

(4)、使用大塊I/O的查詢的磁盤讀次數(shù)比預(yù)料的要多。

(5)、由于大量數(shù)據(jù)修改,使得數(shù)據(jù)頁(yè)和索引頁(yè)沒有充分使用而導(dǎo)致空間的使用超出估算。

(6)、dbcc檢查出索引有問題。 當(dāng)重建聚簇索引時(shí),這張表的所有非聚簇索引將被重建.

2、索引統(tǒng)計(jì)信息的更新 當(dāng)在一個(gè)包含數(shù)據(jù)的表上創(chuàng)建索引的時(shí)候,SQLServer會(huì)創(chuàng)建分布數(shù)據(jù)頁(yè)來存放有關(guān)索引的兩種統(tǒng)計(jì)信息:分布表和密度表。優(yōu)化器利用這個(gè)頁(yè)來判斷該索引對(duì)某個(gè)特定查詢是否有用。但這個(gè)統(tǒng)計(jì)信息并不動(dòng)態(tài)地重新計(jì)算。這意味著,當(dāng)表的數(shù)據(jù)改變之后,統(tǒng)計(jì)信息有可能是過時(shí)的,從而影響優(yōu)化器追求最有工作的目標(biāo)。因此,在下面情況下應(yīng)該運(yùn)行updatestatistics命令:

(1)、數(shù)據(jù)行的插入和刪除修改了數(shù)據(jù)的分布。

(2)、對(duì)用truncatetable刪除數(shù)據(jù)的表上增加數(shù)據(jù)行。

(3)、修改索引列的值。 六、結(jié)束語(yǔ) 實(shí)踐表明,不恰當(dāng)?shù)乃饕坏谑聼o補(bǔ),反而會(huì)降低系統(tǒng)的執(zhí)行性能。因?yàn)榇罅康乃饕诓迦搿⑿薷暮蛣h除操作時(shí)比沒有索引花費(fèi)更多的系統(tǒng)時(shí)間。

例如下面情況下 建立的索引是不恰當(dāng)?shù)?#xff1a;

  • 在查詢中很少或從不引用的列不會(huì)受益于索引,因?yàn)樗饕苌倩驈膩聿槐厮阉骰谶@些列的行。
  • 只有兩個(gè)或三個(gè)值的列,如男性和女性(是或否),從不會(huì)從索引中得到好處。另外,鑒于索引加快了查詢速度,但減慢了數(shù)據(jù)更新速度的特點(diǎn)。可通過在一個(gè)段上建表,而在另一個(gè)段上建其非聚簇索。

建立Clustered索引原則:

1、Primarykey,但必須滿足以下條件:A、常用于Where條件,B、插入記錄時(shí)的字段值是隨機(jī)的(不能用于順序增加的字段,否則將增加最后一個(gè)數(shù)據(jù)頁(yè)的lock等待時(shí)間)

2、用于范圍查詢的字段,如 col1 between 100 and 200; col12>;62 and <70;

3、用于orderby的字段

4、不經(jīng)常改變(update)的字段

5、用于連接條件的字段

其他有關(guān)建立索引的原則:

1、如果索引是唯一的,將其定義為Unique

2、如果使用引用表索引(foreign key ... reference),被引用的列必須建立唯一索引

3、如果建立索引的表有頻繁的插入(Insert)操作,使用fillfactor減少數(shù)據(jù)頁(yè)的分裂、提高并發(fā)性能并減少死鎖

4、如果在一個(gè)只讀表上建立索引,將其fillfactor設(shè)為100以盡可能壓縮數(shù)據(jù)和索引空間

5、盡可能減少單個(gè)索引的長(zhǎng)度

6、在滿足使用的前提下,盡可能使用小容量的數(shù)據(jù)類型(如用numeric代替char)

7、數(shù)值(numeric)的比較在內(nèi)部操作上比字符(string)略快

8、變長(zhǎng)字符串(varchar)和二進(jìn)制(binary)類型比定長(zhǎng)(fixed-length)類型需要更多的系統(tǒng)負(fù)載

9、只要可能,使用定長(zhǎng)(fixed-length)、非空(non-null)、短(short)的數(shù)據(jù)類型字段作為索引

10、連接條件兩端的索引必須是兼容的(最好是同一類型),如果需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換的話,連接索引將不能發(fā)揮作用

建立復(fù)合字段索引的原則

1、當(dāng)條件內(nèi)不包含復(fù)合索引的第一個(gè)字段時(shí),有兩種可能:A、當(dāng)所有select的字段均包含在復(fù)合索引內(nèi)時(shí),做所有索引頁(yè)的遍歷查詢,B、當(dāng)select中包含非復(fù)合索引字段時(shí),做全表數(shù)據(jù)頁(yè)的遍歷查詢,既此時(shí)索引對(duì)檢索無效。

2、復(fù)合索引優(yōu)點(diǎn):A、提供索引覆蓋(index covering)的機(jī)會(huì),但僅限于所有查詢(select)字段均包含在索引內(nèi),B、當(dāng)查詢條件使用到復(fù)合索引的所有字段時(shí),所需要時(shí)間少于這些字段建立單獨(dú)索引的情況,C、復(fù)合索引有利于強(qiáng)制多個(gè)屬性合并后的唯一性限制

3、復(fù)合索引缺點(diǎn):A、需要更多的索引空間,減少每個(gè)索引頁(yè)包含的索引記錄數(shù),并增加索引頁(yè)數(shù)目,B、對(duì)復(fù)合索引中任何一個(gè)字段的變化(update或insert)都會(huì)更新索引,因此復(fù)合索引必須選擇不進(jìn)行變化的字段組成

4、差的復(fù)合索引特點(diǎn):A、復(fù)合索引長(zhǎng)度接近于記錄長(zhǎng)度,B、復(fù)合索引中只有少量字段用于查詢

SYBASE建立索引的原則

補(bǔ)充一點(diǎn):

--創(chuàng)建非聚集索引

1.滿足查詢條件的數(shù)據(jù)不超過20%

2.能實(shí)現(xiàn) index covering

3.用于集函數(shù)、連接、group by和order by的列

4.要權(quán)衡索引對(duì)查詢速度的加快與降低修改速度之間的利弊

--刪除影響性能的索引

如果一個(gè)應(yīng)用在白天執(zhí)行數(shù)據(jù)修改,在夜間生成報(bào)表,就需要在早晨刪除索引,在晚上再把索引重建起來。

另外許多系統(tǒng)設(shè)計(jì)者創(chuàng)建許多優(yōu)化器很少使用的索引,可以根據(jù)showplan,把沒有用的索引刪除。

建立索引

1 2 create unique clustered index code1thidx1 on code_1th(Code1,Name,UnitNo1,Used) on segrun

Unique: 建立唯一性索引

Clustered : 建立聚集索引,使得數(shù)據(jù)行的邏輯順序與物理順序一致,查詢速度較快;每個(gè)表僅允許建立一個(gè)唯一性索引。(非聚集索引nonclustered)

On segrun:將索引放在segrun上

x 刪除索引: dropindex code_1th.code1thidx1

一、APL表的索引

1、Clustering Index:

root level:only one page

intermediate level:

leaf level: leaf page就是數(shù)據(jù)頁(yè)(所以查詢計(jì)劃通過索引就可以讀數(shù)據(jù))

2、Noclustering Index(heap table):

leaf page存放數(shù)據(jù)頁(yè)的rowid(所以查詢計(jì)劃通過索引只能拿到key,再去讀數(shù)據(jù))

二、DOL表的索引

Clustering Index和NonClustering index與在APL表上的非聚集索引結(jié)構(gòu)一樣。(所以查詢計(jì)劃通過索引只能拿到key,再去讀數(shù)據(jù))

索引提示:

1、索引失靈:

當(dāng)使用>條件查詢返回的記錄數(shù)很大時(shí),用索引查詢比全表掃描效率要差很多。

在連接查詢中,連接字段類型最好兼容或一致,否則索引失靈

2、索引KEY數(shù)據(jù)類型優(yōu)先級(jí):

int>char>varchar

3、插入大量數(shù)據(jù)時(shí),先刪除索引,數(shù)據(jù)插入完成后,重建索引。

4、創(chuàng)建索引,加大排序緩存(number of sort buffers)。

5、創(chuàng)建索引順序:群聚索引>非群聚索引

6、創(chuàng)建大量索引后,最好備份數(shù)據(jù)庫(kù)(dump database),事務(wù)日志會(huì)記錄index創(chuàng)建事務(wù)等信息,使數(shù)據(jù)庫(kù)通過事務(wù)日志恢復(fù)可能比較慢。

7、創(chuàng)建群聚索引過程中,表處于獨(dú)占鎖模式,創(chuàng)建非群聚索引過程中,表處于共享鎖,可以select操作。

8、修改表影響了索引中列,需要修改索引列的統(tǒng)計(jì)數(shù)據(jù),例如:修改authors表的所有索引的所有列統(tǒng)計(jì),update index statistics authors

用SQL建立索引

為了給一個(gè)表建立索引,啟動(dòng)任務(wù)欄SQL Sever程序組中的ISQL/w程序。進(jìn)入查詢窗口后,輸入下面的語(yǔ)句:

1 CREATE INDEX mycolumn_index ON mytable (myclumn)

這個(gè)語(yǔ)句建立了一個(gè)名為mycolumn_index的索引。你可以給一個(gè)索引起任何名字,但你應(yīng)該在索引名中包含所索引的字段名,這對(duì)你將來弄清楚建立該索引的意圖是有幫助的。

注意:

在本書中你執(zhí)行任何SQL語(yǔ)句,都會(huì)收到如下的信息:

This command did not return data,and it did not return any rows

這說明該語(yǔ)句執(zhí)行成功了。

索引mycolumn_index對(duì)表mytable的mycolumn字段進(jìn)行。這是個(gè)非聚簇索引,也是個(gè)非唯一索引。(這是一個(gè)索引的缺省屬性)

如果你需要改變一個(gè)索引的類型,你必須刪除原來的索引并重建 一個(gè)。建立了一個(gè)索引后,你可以用下面的SQL語(yǔ)句刪除它:

1 DROP INDEX mytable.mycolumn_index

注意在DROP INDEX 語(yǔ)句中你要包含表的名字。在這個(gè)例子中,你刪除的索引是mycolumn_index,它是表mytable的索引。

要建立一個(gè)聚簇索引,可以使用關(guān)鍵字CLUSTERED。)記住一個(gè)表只能有一個(gè)聚簇索引。(這里有一個(gè)如何對(duì)一個(gè)表建立聚簇索引的例子:

1 CREATE CLUSTERED INDEX mycolumn_clust_indexON mytable(mycolumn)

如果表中有重復(fù)的記錄,當(dāng)你試圖用這個(gè)語(yǔ)句建立索引時(shí),會(huì)出現(xiàn)錯(cuò)誤。但是有重復(fù)記錄的表也可以建立索引;你只要使用關(guān)鍵字ALLOW_DUP_ROW把這一點(diǎn)告訴SQL Sever即可:

1 2 CREATE CLUSTERED INDEX mycolumn_cindex ONmytable(mycolumn) vj1fd}u\"? WITH ALLOW_DUP_ROW

這個(gè)語(yǔ)句建立了一個(gè)允許重復(fù)記錄的聚簇索引。你應(yīng)該盡量避免在一個(gè)表中出現(xiàn)重復(fù)記錄,但是,如果已經(jīng)出現(xiàn)了,你可以使用這種方法。

要對(duì)一個(gè)表建立唯一索引,可以使用關(guān)鍵字UNIQUE。對(duì)聚簇索引和非聚簇索引都可以使用這個(gè)關(guān)鍵字。這里有一個(gè)例子:

1 CREATE UNIQUE COUSTERED INDEXmyclumn_cindex ON mytable(mycolumn)

這是你將經(jīng)常使用的索引建立語(yǔ)句。無論何時(shí),只要可以,你應(yīng)該盡量對(duì)一個(gè)對(duì)一個(gè)表建立唯一聚簇索引來增強(qiáng)查詢操作。

最后,要建立一個(gè)對(duì)多個(gè)字段的索引──復(fù)合索引──在索引建立語(yǔ)句中同時(shí)包含多個(gè)字段名。下面的例子對(duì)firstname和lastname兩個(gè)字段建立索引:

1 CREATE INDEX name_index ONusername(firstname,lastname)

這個(gè)例子對(duì)兩個(gè)字段建立了單個(gè)索引。在一個(gè)復(fù)合索引中,你最多可以對(duì)16個(gè)字段進(jìn)行索引。

用事務(wù)管理器建立索引

用事務(wù)管理器建立索引比用SQL語(yǔ)句容易的多。使用事務(wù)管理器,你可以看到已經(jīng)建立的索引的列表,并可以通過圖形界面選擇索引選項(xiàng)。

使用事務(wù)管理器你可以用兩種方式建立索引:使用Manage Tables窗口或使用Manage Indexes窗口。

要用Manage Tables 窗口建立一個(gè)新索引,單擊按鈕Advanced Options(它看起來象一個(gè)前面有一加號(hào)的表)。這樣就打開了AdvancedOptions對(duì)話框。這個(gè)對(duì)話框有一部分標(biāo)名為Primary Key。

要建立一個(gè)新索引,從下拉列表中選擇你想對(duì)之建立索引的字段名。如果你想建立一個(gè)對(duì)多字段的索引,你可以選擇多個(gè)字段名。你還可以選擇索引是聚簇的還是非聚簇的。在保存表信息后,索引會(huì)自動(dòng)被建立。在Manage Tables窗口中的字段名旁邊,會(huì)出現(xiàn)一把鑰匙。

你已經(jīng)為你的表建立了“主索引”。主索引必須對(duì)不包含空值的字段建立。另外,主索引強(qiáng)制一個(gè)字段成為唯一值字段。

要建立沒有這些限制的索引,你需要使用Manage Indexes窗口。從菜單中選擇Manage|Indexes,打開Manage Indexes 窗口。在Manage Indexes 窗口中,你可以通過下拉框選擇表和特定的索引。要建立一個(gè)新索引,從Index下拉框中選擇NewIndex.,然后就可以選擇要對(duì)之建立索引的字段。單擊按鈕Add,把字段加人到索引中。

你可以為你的索引選擇許多不同的選項(xiàng)。例如,你可以選擇該索引是聚簇的還是非聚簇的。你還可以指定該索引為唯一索引。設(shè)計(jì)好索引后,單擊按鈕Build,建立該索引。

?

總結(jié)

以上是生活随笔為你收集整理的sybase性能优化经验浅谈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。