相當(dāng)于把1個巨大的表拆分成數(shù)百個小表,特別是按照日期分,如果數(shù)據(jù)有3-5年,因為每次訪問可能只是幾天-幾個月,這樣就極大的縮少了數(shù)據(jù)范圍,掃描的數(shù)據(jù)量少了,速度自然快了。。
創(chuàng)新互聯(lián)公司長期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為墨竹工卡企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都做網(wǎng)站,墨竹工卡網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
再加上使用分區(qū)索引后,分區(qū)索引是針對單個分區(qū)表的索引,這樣就會存在多個B+的索引,索引小了,維護(hù)起來自然快了,在單個分區(qū)里查詢,其面對的索引樹也是很小的,自然相關(guān)性能就提高了。。
SQL Server數(shù)據(jù)庫查詢速度慢的原因有很多,常見的有以下幾種:
1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是數(shù)據(jù)庫設(shè)計的缺陷)
2、I/O吞吐量小,形成了瓶頸效應(yīng)。
3、沒有創(chuàng)建計算列導(dǎo)致查詢不優(yōu)化。
4、內(nèi)存不足
5、網(wǎng)絡(luò)速度慢
6、查詢出的數(shù)據(jù)量過大(可以采用多次查詢,其他的方法降低數(shù)據(jù)量)
7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設(shè)計的缺陷)
8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。
9、返回了不必要的行和列
10、查詢語句不好,沒有優(yōu)化
●可以通過以下方法來優(yōu)化查詢 :
1、把數(shù)據(jù)、日志、索引放到不同的I/O設(shè)備上,增加讀取速度,以前可以將Tempdb應(yīng)放在RAID0上,SQL2000不在支持。數(shù)據(jù)量(尺寸)越大,提高I/O越重要。
2、縱向、橫向分割表,減少表的尺寸(sp_spaceuse)
3、升級硬件
4、根據(jù)查詢條件,建立索引,優(yōu)化索引、優(yōu)化訪問方式,限制結(jié)果集的數(shù)據(jù)量。注意填充因子要適當(dāng)(最好是使用默認(rèn)值0)。索引應(yīng)該盡量小,使用字節(jié)數(shù)小的列建索引好(參照索引的創(chuàng)建),不要對有限的幾個值的字段建單一索引如性別字段。
在SQL Server2000 中事務(wù)復(fù)制的改進(jìn)主要包括以下幾個方面.并行快照處理保證即使在創(chuàng)建初始快照時仍可對出版表進(jìn)行修改提高錯誤處理能力可以跳過指定的錯誤繼續(xù)進(jìn)行數(shù)據(jù)復(fù)制.在訂購者處對復(fù)制數(shù)據(jù)進(jìn)行確認(rèn)包括對垂直分割的確認(rèn)通過SQL Server Enterprise Manager 也可以使用確認(rèn)
---
以上,希望對你有所幫助。
MS SQL Server:分區(qū)表、分區(qū)索引 詳解
1. 分區(qū)表簡介
使用分區(qū)表的主要目的,是為了改善大型表以及具有各種訪問模式的表的可伸縮性和可管理性。
? 大型表:數(shù)據(jù)量巨大的表。
? 訪問模式:因目的不同,需訪問的不同的數(shù)據(jù)行集,每種目的的訪問可以稱之為一種訪問模式。
分區(qū)一方面可以將數(shù)據(jù)分為更小、更易管理的部分,為提高性能起到一定的作用;另一方面,對于如果具有多個CPU的系統(tǒng),分區(qū)可以是對表的操作通過并行的方式進(jìn)行,這對于提升性能是非常有幫助的。
注意:只能在 SQL Server Enterprise Edition 中創(chuàng)建分區(qū)函數(shù)。只有 SQL Server Enterprise Edition 支持分區(qū)。
2. 創(chuàng)建分區(qū)表或分區(qū)索引的步驟
可以分為以下步驟:
1. 確定分區(qū)列和分區(qū)數(shù)
2. 確定是否使用多個文件組
3. 創(chuàng)建分區(qū)函數(shù)
4. 創(chuàng)建分區(qū)架構(gòu)(Schema)
5. 創(chuàng)建分區(qū)表
6. 創(chuàng)建分區(qū)索引
下面詳細(xì)描述的創(chuàng)建分區(qū)表、分區(qū)索引的步驟。
2.1. 確定分區(qū)列和分區(qū)數(shù)
在開始做分區(qū)操作之前,首先要確定待分區(qū)表的訪問模式,該模式?jīng)Q定了什么列適合做分區(qū)鍵。例如,對于銷售數(shù)據(jù),一般會先根據(jù)日期把數(shù)據(jù)范圍限定在一個范圍內(nèi),然后在這個基礎(chǔ)上做進(jìn)一步的查詢,這樣,就可以把日期作為分區(qū)列。
確定了分區(qū)列之后,需要進(jìn)一步確定分區(qū)數(shù),亦即分區(qū)表中需要包含多少數(shù)據(jù),每個分區(qū)的數(shù)據(jù)應(yīng)該限定在哪個范圍。
2.2. 確定是否使用多個文件組
為了有助于優(yōu)化性能和維護(hù),應(yīng)該使用文件組分離數(shù)據(jù)。一般情況下,如果經(jīng)常對分區(qū)的整個數(shù)據(jù)集操作,則文件組數(shù)最好與分區(qū)數(shù)相同,并且這些文件組通常應(yīng)該位于不同的磁盤上,再配合多個CPU,則SQL Server 可以并行處理多個分區(qū),從而大大縮短處理大量復(fù)雜報表和分析的總體時間。
2.3. 創(chuàng)建分區(qū)函數(shù)
分區(qū)函數(shù)用于定義分區(qū)的邊界條件,創(chuàng)建分區(qū)函數(shù)的語法如下:
CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )
AS RANGE [ LEFT | RIGHT ]
FOR VALUES ( [ boundary_value [ ,...n ] ] )
[ ; ]
參數(shù)說明:
? partition_function_name
是分區(qū)函數(shù)的名稱。分區(qū)函數(shù)名稱在數(shù)據(jù)庫內(nèi)必須唯一,并且符合標(biāo)識符的規(guī)則。
? input_parameter_type
是用于分區(qū)的列的數(shù)據(jù)類型。當(dāng)用作分區(qū)列時,除 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、別名數(shù)據(jù)類型或 CLR 用戶定義數(shù)據(jù)類型外,所有數(shù)據(jù)類型均有效。
實際列(也稱為分區(qū)列)是在 CREATE TABLE 或 CREATE INDEX 語句中指定的。
? boundary_value
為使用 partition_function_name 的已分區(qū)表或索引的每個分區(qū)指定邊界值。如果 boundary_value 為空,則分區(qū)函數(shù)使用 partition_function_name 將整個表或索引映射到單個分區(qū)。只能使用 CREATE TABLE 或 CREATE INDEX 語句中指定的一個分區(qū)列。
boundary_value 是可以引用變量的常量表達(dá)式。這包括用戶定義類型變量,或函數(shù)以及用戶定義函數(shù)。它不能引用 Transact-SQL 表達(dá)式。boundary_value 必須與 input_parameter_type 中提供的數(shù)據(jù)類型相匹配或者可隱式轉(zhuǎn)換為該數(shù)據(jù)類型,并且如果該值的大小和小數(shù)位數(shù)與 input_parameter_type 中相應(yīng)的值的大小和小數(shù)位數(shù)不匹配,則在隱式轉(zhuǎn)換過程中該值不能被截斷。
注意:
如果 boundary_value 包含 datetime 或 smalldatetime 文字值,則為這些文字值在計算時假設(shè) us_english 是會話語言。不推薦使用此行為。要確保分區(qū)函數(shù)定義對于所有會話語言都具有預(yù)期的行為,建議使用對于所有語言設(shè)置都以相同方式進(jìn)行解釋的常量,例如 yyyymmdd 格式;或者將文字值顯式轉(zhuǎn)換為特定樣式。有關(guān)詳細(xì)信息,請參閱編寫國際化 Transact-SQL 語句。若要確定服務(wù)器的語言會話,請運(yùn)行 SELECT @@LANGUAGE。
? ...n
指定 boundary_value 提供的值的數(shù)目,不能超過 999。所創(chuàng)建的分區(qū)數(shù)等于 n + 1。不必按順序列出各值。如果值未按順序列出,則 Microsoft SQL Server 2005 數(shù)據(jù)庫引擎將對它們進(jìn)行排序,創(chuàng)建函數(shù)并返回一個警告,說明未按順序提供值。如果 n 包括任何重復(fù)的值,則數(shù)據(jù)庫引擎將返回錯誤。
? LEFT | RIGHT
指定當(dāng)間隔值由 數(shù)據(jù)庫引擎 按升序從左到右排序時,boundary_value [ ,...n ] 屬于每個邊界值間隔的哪一側(cè)(左側(cè)還是右側(cè))。如果未指定,則默認(rèn)值為 LEFT。
創(chuàng)建分區(qū)函數(shù)示例:
CREATE PARTITION FUNCTION PF_Left(int)
AS RANGE LEFT
FOR VALUES(10, 20)
GO
CREATE PARTITION FUNCTION PF_Right(int)
AS RANGE LEFT
FOR VALUES(10, 20)
GO
PF_Left 和 PF_Right 分區(qū)函數(shù)的區(qū)分:
分區(qū)函數(shù) 分區(qū)1 分區(qū)2 分區(qū)3
PF_Left = 10 10 and = 20 20
PF_Right 10 = 10 and 20 = 20
2.4. 創(chuàng)建分區(qū)架構(gòu)(Schema)
創(chuàng)建分區(qū)函數(shù)后,必須將其與分區(qū)架構(gòu)(Schema)相關(guān)聯(lián),以便將分區(qū)定向至特定的文件組。定義分區(qū)架構(gòu)師,即使多個分區(qū)位于同一個文件組中,也必須為每個分區(qū)指定一個文件組。
創(chuàng)建分區(qū)架構(gòu)的語法如下:
GOCREATE PARTITION SCHEME partition_scheme_name
AS PARTITION partition_function_name
[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )
[ ; ]
參數(shù):
? partition_scheme_name
分區(qū)方案的名稱。分區(qū)方案名稱在數(shù)據(jù)庫中必須是唯一的,并且符合標(biāo)識符規(guī)則。
? partition_function_name
使用分區(qū)方案的分區(qū)函數(shù)的名稱。分區(qū)函數(shù)所創(chuàng)建的分區(qū)將映射到在分區(qū)方案中指定的文件組。partition_function_name 必須已經(jīng)存在于數(shù)據(jù)庫中。
? ALL
指定所有分區(qū)都映射到在 file_group_name 中提供的文件組,或映射到主文件組(如果指定了 [PRIMARY]。如果指定了 ALL,則只能指定一個 file_group_name。
? file_group_name | [ PRIMARY ] [ ,...n]
指定用來持有由 partition_function_name 指定的分區(qū)的文件組的名稱。file_group_name 必須已經(jīng)存在于數(shù)據(jù)庫中。
如果指定了 [PRIMARY],則分區(qū)將存儲于主文件組中。如果指定了 ALL,則只能指定一個 file_group_name。分區(qū)分配到文件組的順序是從分區(qū) 1 開始,按文件組在 [,...n] 中列出的順序進(jìn)行分配。在 [,...n] 中,可以多次指定同一個 file_group_name。如果 n 不足以擁有在 partition_function_name 中指定的分區(qū)數(shù),則 CREATE PARTITION SCHEME 將失敗,并返回錯誤。
如果 partition_function_name 生成的分區(qū)數(shù)少于文件組數(shù),則第一個未分配的文件組將標(biāo)記為 NEXT USED,并且出現(xiàn)顯示命名 NEXT USED 文件組的信息。如果指定了 ALL,則單獨的 file_group_name 將為該 partition_function_name 保持它的 NEXT USED 屬性。如果在 ALTER PARTITION FUNCTION 語句中創(chuàng)建了一個分區(qū),則 NEXT USED 文件組將再接收一個分區(qū)。若要再創(chuàng)建一個未分配的文件組來擁有新的分區(qū),請使用 ALTER PARTITION SCHEME。
在 file_group_name[ 1,...n] 中指定主文件組時,必須像在 [PRIMARY] 中那樣分隔 PRIMARY,因為它是關(guān)鍵字。
創(chuàng)建分區(qū)架構(gòu)示例:
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES (1, 100, 1000);
GO
CREATE PARTITION SCHEME myRangePS1
AS PARTITION myRangePF1
TO (test1fg, test2fg, test3fg, test4fg);
GO
2.5. 創(chuàng)建分區(qū)表
定義了分區(qū)函數(shù)(邏輯結(jié)構(gòu))和分區(qū)架構(gòu)(物理結(jié)構(gòu))后,既可以創(chuàng)建分區(qū)表來利用它們。分區(qū)表定義應(yīng)使用的分區(qū)架構(gòu),而分區(qū)架構(gòu)又定義其使用的分區(qū)函數(shù)。要將這三者結(jié)合起來,必須指定應(yīng)用于分區(qū)函數(shù)的列 。范圍分區(qū)始終只映射到表中的一列。
CREATE TABLE 語法如下:
CREATE TABLE
[ database_name . [ schema_name ] . | schema_name . ] table_name
( { column_definition | computed_column_definition }
[ table_constraint ] [ ,...n ] )
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| "default" } ]
[ { TEXTIMAGE_ON { filegroup | "default" } ]
[ ; ]
示例如下:
CREATE TABLE myRangePT1
(
ID int not null,
AGE int,
PRIMARY KEY (ID)
) ON myRangePS1(myRangePF1)
GO
2.6. 創(chuàng)建分區(qū)索引
索引對于提高查詢性能非常有效,因此,一般應(yīng)該考慮應(yīng)該考慮為分區(qū)表建立索引,為分區(qū)表建立索引與為普通表建立索引的語法一直,但是,其行為與普通索引有所差異。
默認(rèn)情況下,分區(qū)表中創(chuàng)建的索引使用與分區(qū)表相同分區(qū)架構(gòu)和分區(qū)列,這樣,索引將于表對齊。將表與其索引對齊,可以使管理工作更容易進(jìn)行,對于滑動窗口方案尤其如此。若要啟動分區(qū)切換,表的所有索引都必須對齊。
在創(chuàng)建索引時,也可以指定不同的分區(qū)方案(Schema)或單獨的文件組(FileGroup)來存儲索引,這樣SQL Server 不會將索引與表對齊。
在已分區(qū)的表上創(chuàng)建索引(分區(qū)索引)時,應(yīng)該注意以下事項:
? 唯一索引
建立唯一索引(聚集或者非聚集)時,分區(qū)列必須出現(xiàn)在索引列中。此限制將使SQL Server只調(diào)查單個分區(qū),并確保表中寵物的新鍵值。如果分區(qū)依據(jù)列不可能包含在唯一鍵中,則必須使用DML觸發(fā)器,而不是強(qiáng)制實現(xiàn)唯一性。
? 非唯一索引
對非唯一的聚集索引進(jìn)行分區(qū)時,如果未在聚集鍵中明確指定分區(qū)依據(jù)列,默認(rèn)情況下SQL Server 將在聚集索引列中添加分區(qū)依據(jù)列。
對非唯一的非聚集索引進(jìn)行分區(qū)時,默認(rèn)情況下SQL Server 將分區(qū)依據(jù)列添加為索引的包含性列,以確保索引與基表對齊,若果索引中已經(jīng)存在分區(qū)依據(jù)列,SQL Server 將不會像索引中添加分區(qū)依據(jù)列。
3. 分區(qū)操作
分區(qū)適用于可以縮放的大型表,所以隨著時間和環(huán)境的變化,就會產(chǎn)生對分區(qū)的拆分、合并、移動的需求。
3.1. 拆分與合并分區(qū)
通過拆分或合并邊界值更改分區(qū)函數(shù)。通過執(zhí)行 ALTER PARTITION FUNCTION,可以將使用分區(qū)函數(shù)的任何表或索引的某個分區(qū)拆分為兩個分區(qū),也可以將兩個分區(qū)合并為一個分區(qū)。
注意:多個表或索引可以使用同一分區(qū)函數(shù)。ALTER PARTITION FUNCTION 在單個事務(wù)中影響所有這些表或索引。
ALTER PARTITION FUNCTION 語法如下:
ALTER PARTITION FUNCTION partition_function_name()
{
SPLIT RANGE ( boundary_value )
| MERGE RANGE ( boundary_value )
} [ ; ]
參數(shù)說明:
? partition_function_name
要修改的分區(qū)函數(shù)的名稱。
? SPLIT RANGE ( boundary_value )
在分區(qū)函數(shù)中添加一個分區(qū)。boundary_value 確定新分區(qū)的范圍,因此它必須不同于分區(qū)函數(shù)的現(xiàn)有邊界范圍。根據(jù) boundary_value,Microsoft SQL Server 2005 數(shù)據(jù)庫引擎將某個現(xiàn)有范圍拆分為兩個范圍。在這兩個范圍中,新 boundary_value 所在的范圍被視為是新分區(qū)。
重要提示:
文件組必須處于聯(lián)機(jī)狀態(tài),并且必須由使用此分區(qū)函數(shù)的分區(qū)方案標(biāo)記為 NEXT USED,以保存新分區(qū)。在 CREATE PARTITION SCHEME 語句中,將把文件組分配給分區(qū)。如果 CREATE PARTITION SCHEME 語句分配了多余的文件組(在 CREATE PARTITION FUNCTION 語句中創(chuàng)建的分區(qū)數(shù)少于用于保存它們的文件組),則存在未分配的文件組,分區(qū)方案將把其中的某個文件組標(biāo)記為 NEXT USED。該文件組將保存新的分區(qū)。如果分區(qū)方案未將任何文件組標(biāo)記為 NEXT USED,則必須使用 ALTER PARTITION SCHEME 添加一個文件組或指定一個現(xiàn)有文件組來保存新分區(qū)??梢灾付ㄒ驯4娣謪^(qū)的文件組來保存附加分區(qū)。由于一個分區(qū)函數(shù)可以參與多個分區(qū)方案,因此所有使用分區(qū)函數(shù)(您向其中添加了分區(qū))的分區(qū)方案都必須擁有一個 NEXT USED 文件組。否則,ALTER PARTITION FUNCTION 將失敗并出現(xiàn)錯誤,該錯誤顯示缺少 NEXT USED 文件組的一個或多個分區(qū)方案。
? MERGE [ RANGE ( boundary_value) ]
刪除一個分區(qū)并將該分區(qū)中存在的所有值都合并到剩余的某個分區(qū)中。RANGE (boundary_value) 必須是一個現(xiàn)有邊界值,已刪除分區(qū)中的值將合并到該值中。如果最初保存 boundary_value 的文件組沒有被剩余分區(qū)使用,也沒有使用 NEXT USED 屬性進(jìn)行標(biāo)記,則將從分區(qū)方案中刪除該文件組。合并的分區(qū)駐留在最初不保存 boundary_value 的文件組中。boundary_value 是一個可以引用變量(包括用戶定義類型變量)或函數(shù)(包括用戶定義函數(shù))的常量表達(dá)式。它無法引用 Transact-SQL 表達(dá)式。boundary_value 必須匹配或可以隱式轉(zhuǎn)換為其對應(yīng)列的數(shù)據(jù)類型,并且當(dāng)值的大小和小數(shù)位數(shù)不匹配其對應(yīng) input_parameter_type 時,將無法在隱式轉(zhuǎn)換過程中被截斷。
行內(nèi)容以path或者層次元素列表的形式顯示出來。
取得一個表的所有字段名,用逗號分割。
select max(substr(SYS_CONNECT_BY_PATH(COLUMN_NAME, ','),2)) col from (
select COLUMN_NAME,column_id from user_tab_columns where table_name='表名')
start with column_id=1
connect by column_id=rownum;
從這點上講Oracle比SQLSERVER取字段要麻煩多了
在SQLSERVER里可以直接在SQL的查詢分析器中直接選中表右擊選select就可以自動生成表的所有字段名用逗號分割
sql server 2008數(shù)據(jù)庫分離操作跟sql server 2005是一樣的,以下具體介紹如何分離sql server 數(shù)據(jù)庫:
1、打開 sql server 控制臺(SQL Server Management Studio),然后登錄。
2、登錄時如果知道sa密碼可以使用“SQL Server身份驗證”模式登錄,如果不知道sa密碼可以使用“windows身份驗證”模式登錄就不需要密碼登錄。而sql server 2008的用戶一般是在安裝的時候自定義的用戶,但也可以使用“windows身份驗證”模式登錄。
3、登錄到控制到中之后,找到【數(shù)據(jù)庫】點擊展開,然后找到你所需要分離的數(shù)據(jù)庫名稱。選中數(shù)據(jù)庫【右鍵】-【任務(wù)】-【分離】即可。
附件說明:分離數(shù)據(jù)庫一般是需要將數(shù)據(jù)庫拷貝到其他機(jī)器或者是移動磁盤時和不需要使用該數(shù)據(jù)庫的情況下才做數(shù)據(jù)庫分離。數(shù)據(jù)庫一旦分離之后所對應(yīng)的軟件將無法正常使用和打開數(shù)據(jù)庫。如果需要重新將數(shù)據(jù)庫還原到數(shù)據(jù)庫控制臺中,選中【數(shù)據(jù)庫】-【右鍵】-【附加】,找到你所要附件的數(shù)據(jù)所在的磁盤路徑,選擇以“.MDF”為后綴的文件即可。