當前位置:首頁 » 編程語言 » sql添加聚集索引
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql添加聚集索引

發布時間: 2022-06-20 06:37:24

sql中索引有幾種每種的定義是什麼如何添加索引添加索引的好處是什麼

聚集索引和非聚集索引 聚集索引存儲記錄是物理上連續存在 非聚集索引是邏輯上的連續,物理存儲並不連續
REATE [UNIQUE][CLUSTERED | NONCLUSTERED] INDEX index_name

ON {table_name | view_name} [WITH [index_property [,....n]]

說明:

UNIQUE: 建立唯一索引。

CLUSTERED: 建立聚集索引。

NONCLUSTERED: 建立非聚集索引。

Index_property: 索引屬性。

UNIQUE索引既可以採用聚集索引結構,也可以採用非聚集索引的結構,如果不指明採用的索引結構,則SQL Server系統默認為採用非聚集索引結構

❷ MySQL中怎樣創建聚集索引和非聚集索引,求創建這兩種索引的SQL語句。謝謝

InnoDB按照主鍵進行聚集,如果沒有定義主鍵,InnoDB會試著使用唯一的非空索引來代替。如果沒有這種索引,InnoDB就會定義隱藏的主鍵然後在上面進行聚集。

所以,對於 聚集索引 來說,你創建主鍵的時候,自動就創建了主鍵的聚集索引。

而普通索引(非聚集索引)的語法,大多數資料庫都是通用的:

CREATE INDEX Syntax

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[index_type]
ON tbl_name (index_col_name,...)
[index_type]

index_col_name:
col_name [(length)] [ASC | DESC]

index_type:
USING {BTREE | HASH | RTREE}

[java] view plain
-- 創建無索引的表格
create table testNoPK (
id int not null,
name varchar(10)
);
-- 創建普通索引
create index IDX_testNoPK_Name on testNoPK (name);

❸ SQL Server 2012怎麼創建聚族索引

--一般聚集索引都是創建在主鍵上的
--給你腳本
有什麼不明白的可以隨時找我
希望採納
--把漢字換成相應的對象即可
ALTER
TABLE
表名
ADD
CONSTRAINT
索引名
PRIMARY
KEY
CLUSTERED
(
創建索引的欄位(主鍵欄位)
ASC
)WITH
(PAD_INDEX
=
OFF,
STATISTICS_NORECOMPUTE
=
OFF,
SORT_IN_TEMPDB
=
OFF,
IGNORE_DUP_KEY
=
OFF,
ONLINE
=
OFF,
ALLOW_ROW_LOCKS
=
ON,
ALLOW_PAGE_LOCKS
=
ON)
ON
[PRIMARY]
GO

❹ sql怎麼建立索引

進入查詢窗口後,輸入下面的語句:

CREATE INDEX mycolumn_index ON mytable (myclumn)

這個語句建立了一個名為mycolumn_index的索引。你可以給一個索引起任何名字,但你應該在索引名中包含所索引的欄位名,這對你將來弄清楚建立該索引的意圖是有幫助的。

注意:

在本書中你執行任何SQL語句,都會收到如下的信息:

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

這說明該語句執行成功了。

索引mycolumn_index對表mytable的mycolumn欄位進行。這是個非聚簇索引,也是個非唯一索引。(這是一個索引的預設屬性)

如果你需要改變一個索引的類型,你必須刪除原來的索引並重建 一個。建立了一個索引後,你可以用下面的SQL語句刪除它:

DROP INDEX mytable.mycolumn_index

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

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

CREATE CLUSTERED INDEX mycolumn_clust_index ON mytable(mycolumn)

如果表中有重復的記錄,當你試圖用這個語句建立索引時,會出現錯誤。但是有重復記錄的表也可以建立索引;你只要使用關鍵字ALLOW_DUP_ROW把這一點告訴SQL Sever即可:

CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)

WITH ALLOW_DUP_ROW

這個語句建立了一個允許重復記錄的聚簇索引。你應該盡量避免在一個表中出現重復記錄,但是,如果已經出現了,你可以使用這種方法。

要對一個表建立唯一索引,可以使用關鍵字UNIQUE。對聚簇索引和非聚簇索引都可以使用這個關鍵字。這里有一個例子:

CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

這是你將經常使用的索引建立語句。無論何時,只要可以,你應該盡量對一個對一個表建立唯一聚簇索引來增強查詢操作。

最後,要建立一個對多個欄位的索引——復合索引——在索引建立語句中同時包含多個欄位名。下面的例子對firstname和lastname兩個欄位建立索引:

CREATE INDEX name_index ON username(firstname,lastname)

這個例子對兩個欄位建立了單個索引。在一個復合索引中,你最多可以對16個欄位進行索引。

用事務管理器建立索引

用事務管理器建立索引比用SQL語句容易的多。使用事務管理器,你可以看到已經建立的索引的列表,並可以通過圖形界面選擇索引選項。

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

要用Manage Tables 窗口建立一個新索引,單擊按鈕Advanced Options(它看起來象一個前面有一加號的表)。這樣就打開了Advanced Options對話框。這個對話框有一部分標名為Primary Key(見圖11.1)。

圖11。1

要建立一個新索引,從下拉列表中選擇你想對之建立索引的欄位名。如果你想建立一個對多欄位的索引,你可以選擇多個欄位名。你還可以選擇索引是聚簇的還是非聚簇的。在保存表信息後,索引會自動被建立。在Manage Tables窗口中的欄位名旁邊,會出現一把鑰匙。

你已經為你的表建立了「主索引」。主索引必須對不包含空值的欄位建立。另外,主索引強制一個欄位成為唯一值欄位。

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

圖11。2

你可以為你的索引選擇許多不同的選項。例如,你可以選擇該索引是聚簇的還是非聚簇的。你還可以指定該索引為唯一索引。設計好索引後,單擊按鈕Build,建立該索引。

注意:

唯一索引是指該欄位不能有重復的值,而不是只能建立這一個索引。

SQL核心語句

在第十章,你學會了如何用SQL SELECT 語句從一個表中取數據。但是,到現在為止,還沒有討論如何添加,修改或刪除表中的數據。在這一節中,你將學習這些內容。

插入數據

向表中添加一個新記錄,你要使用SQL INSERT 語句。這里有一個如何使用這種語句的例子:

INSERT mytable (mycolumn) VALUES (『some data')

這個語句把字元串'some data'插入表mytable的mycolumn欄位中。將要被插入數據的欄位的名字在第一個括弧中指定,實際的數據在第二個括弧中給出。

INSERT 語句的完整句法如下:

INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |

Values_list | select_statement}

如果一個表有多個欄位,通過把欄位名和欄位值用逗號隔開,你可以向所有的欄位中插入數據。假設表mytable有三個欄位first_column,second_column,和third_column。下面的INSERT語句添加了一條三個欄位都有值的完整記錄:

INSERT mytable (first_column,second_column,third_column)

VALUES (『some data','some more data','yet more data')

注意:

你可以使用INSERT語句向文本型欄位中插入數據。但是,如果你需要輸入很長的字元串,你應該使用WRITETEXT語句。這部分內容對本書來說太高級了,因此不加討論。要了解更多的信息,請參考Microsoft SQL Sever 的文檔。

如果你在INSERT 語句中只指定兩個欄位和數據會怎麼樣呢?換句話說,你向一個表中插入一條新記錄,但有一個欄位沒有提供數據。在這種情況下,有下面的四種可能:

如果該欄位有一個預設值,該值會被使用。例如,假設你插入新記錄時沒有給欄位third_column提供數據,而這個欄位有一個預設值'some value'。在這種情況下,當新記錄建立時會插入值'some value'。
如果該欄位可以接受空值,而且沒有預設值,則會被插入空值。
如果該欄位不能接受空值,而且沒有預設值,就會出現錯誤。你會收到錯誤信息:
The column in table mytable may not be null.

最後,如果該欄位是一個標識欄位,那麼它會自動產生一個新值。當你向一個有標識欄位的表中插入新記錄時,只要忽略該欄位,標識欄位會給自己賦一個新值。
注意:

向一個有標識欄位的表中插入新記錄後,你可以用SQL變數@@identity來訪問新記錄

的標識欄位的值。考慮如下的SQL語句:

INSERT mytable (first_column) VALUES(『some value')

INSERT anothertable(another_first,another_second)

VALUES(@@identity,'some value')

如果表mytable有一個標識欄位,該欄位的值會被插入表anothertable的another_first欄位。這是因為變數@@identity總是保存最後一次插入標識欄位的值。

欄位another_first應該與欄位first_column有相同的數據類型。但是,欄位another_first不能是應該標識欄位。Another_first欄位用來保存欄位first_column的值。

刪除記錄

要從表中刪除一個或多個記錄,需要使用SQL DELETE語句。你可以給DELETE 語句提供WHERE 子句。WHERE子句用來選擇要刪除的記錄。例如,下面的這個DELETE語句只刪除欄位first_column的值等於'Delete Me'的記錄:

DELETE mytable WHERE first_column='Deltet Me'

DELETE 語句的完整句法如下:

DELETE [FROM] {table_name|view_name} [WHERE clause]

在SQL SELECT 語句中可以使用的任何條件都可以在DELECT 語句的WHERE子句中使用。例如,下面的這個DELETE語句只刪除那些first_column欄位的值為'goodbye'或 second_column欄位的值為 'so long'的記錄:

DELETE mytable WHERE first_column='goodby' OR second_column='so long'

如果你不給DELETE 語句提供WHERE 子句,表中的所有記錄都將被刪除。你不應該有這種想法。如果你想刪除應該表中的所有記錄,應使用第十章所講的TRUNCATE TABLE語句。

注意:

為什麼要用TRUNCATE TABLE 語句代替DELETE語句?當你使用TRUNCATE TABLE語句時,記錄的刪除是不作記錄的。也就是說,這意味著TRUNCATE TABLE 要比DELETE快得多

❺ 如何用sql語句在列上建立聚集索引

可以用如下語句
create clustered index 索引名 on 表名(欄位名)

❻ SQL中一個表可以有幾個聚集索引或非聚集索引

一個表只能有一個聚集索引,可以有多個非聚集索引

下面是聚集索引和非聚集索引的詳細介紹:
聚集索引基於數據行的鍵值在表內排序和存儲這些數據行。每個表只能有一個聚集索引,因為數據行本身只能按一個順序存儲。有關聚集索引體系結構的詳細信息,請參閱聚集索引結構。

每個表幾乎都對列定義聚集索引來實現下列功能:

可用於經常使用的查詢。

提供高度唯一性。

注意:

創建 PRIMARY KEY 約束時,將在列上自動創建唯一索引。默認情況下,此索引是聚集索引,但是在創建約束時,可以指定創建非聚集索引。

可用於范圍查詢。

如果未使用 UNIQUE 屬性創建聚集索引,資料庫引擎將向表自動添加一個 4 位元組的 uniqueifier
列。必要時,資料庫引擎將向行自動添加一個 uniqueifier 值以使每個鍵唯一。此列和列值供內部使用,用戶不能查看或訪問。

查詢注意事項

在創建聚集索引之前,應先了解數據是如何被訪問的。考慮對具有以下特點的查詢使用聚集索引:

使用運算符(如 BETWEEN、>、>=、< 和
<=)返回一系列值。

使用聚集索引找到包含第一個值的行後,便可以確保包含後續索引值的行物理相鄰。例如,如果某個查詢在一系列銷售訂單號間檢索記錄,SalesOrderNumber
列的聚集索引可快速定位包含起始銷售訂單號的行,然後檢索表中所有連續的行,直到檢索到最後的銷售訂單號。

返回大型結果集。

使用 JOIN 子句;一般情況下,使用該子句的是外鍵列。

使用 ORDER BY 或 GROUP BY 子句。

在 ORDER BY 或 GROUP BY
子句中指定的列的索引,可以使資料庫引擎不必對數據進行排序,因為這些行已經排序。這樣可以提高查詢性能。

列注意事項

一般情況下,定義聚集索引鍵時使用的列越少越好。考慮具有下列一個或多個屬性的列:

唯一或包含許多不重復的值

例如,雇員 ID 唯一地標識雇員。EmployeeID 列的聚集索引或 PRIMARY KEY
約束將改善基於雇員 ID 號搜索雇員信息的查詢的性能。另外,可對
LastName、FirstName、MiddleName
列創建聚集索引,因為經常以這種方式分組和查詢雇員記錄,而且這些列的組合還可提供高區分度。

按順序被訪問

例如,產品 ID 唯一地標識 AdventureWorks2008R2 資料庫的
Proction.Proct 表中的產品。在其中指定順序搜索的查詢(如 WHERE ProctID BETWEEN 980
and 999)將從 ProctID 的聚集索引受益。這是因為行將按該鍵列的排序順序存儲。

由於保證了列在表中是唯一的,所以定義為 IDENTITY。

經常用於對表中檢索到的數據進行排序。

按該列對表進行聚集(即物理排序)是一個好方法,它可以在每次查詢該列時節省排序操作的成本。

聚集索引不適用於具有下列屬性的列:

頻繁更改的列

這將導致整行移動,因為資料庫引擎必須按物理順序保留行中的數據值。這一點要特別注意,因為在大容量事務處理系統中數據通常是可變的。

寬鍵

寬鍵是若干列或若干大型列的組合。所有非聚集索引將聚集索引中的鍵值用作查找鍵。為同一表定義的任何非聚集索引都將增大許多,這是因為非聚集索引項包含聚集鍵,同時也包含為此非聚集索引定義的鍵列。

索引選項

創建聚集索引時,可指定若干索引選項。因為聚集索引通常都很大,所以應特別注意下列選項:

SORT_IN_TEMPDB

DROP_EXISTING

FILLFACTOR

ONLINE

非聚集索引包含索引鍵值和指向表數據存儲位置的行定位器。有關非聚集索引體系結構的詳細信息,請參閱非聚集索引結構。

可以對表或索引視圖創建多個非聚集索引。通常,設計非聚集索引是為改善經常使用的、沒有建立聚集索引的查詢的性能。

與使用書中索引的方式相似,查詢優化器在搜索數據值時,先搜索非聚集索引以找到數據值在表中的位置,然後直接從該位置檢索數據。這使非聚集索引成為完全匹配查詢的最佳選擇,因為索引包含說明查詢所搜索的數據值在表中的精確位置的項。例如,為了從
Person.Person 表中查詢具有特定姓氏的人員,查詢優化器可能使用非聚集索引
IX_Person_LastName_FirstName_MiddleName;它以 LastName 作為自己的一個鍵列。查詢優化器能快速找出索引中與指定
LastName
匹配的所有項。每個索引項都指向表或聚集索引中准確的頁和行,其中可以找到相應的數據。在查詢優化器在索引中找到所有項之後,它可以直接轉到准確的頁和行進行數據檢索。

資料庫注意事項

設計非聚集索引時需要注意資料庫的特徵。

更新要求較低但包含大量數據的資料庫或表可以從許多非聚集索引中獲益從而改善查詢性能。與全表非聚集索引相比,考慮為定義完善的數據子集創建篩選索引可以提高查詢性能、降低索引存儲開銷並減少索引維護開銷。

決策支持系統應用程序和主要包含只讀數據的資料庫可以從許多非聚集索引中獲益。查詢優化器具有更多可供選擇的索引用來確定最快的訪問方法,並且資料庫的低更新特徵意味著索引維護不會降低性能。

聯機事務處理應用程序和包含大量更新表的資料庫應避免使用過多的索引。此外,索引應該是窄的,即列越少越好。

一個表如果建有大量索引會影響
INSERT、UPDATE、DELETE 和 MERGE
語句的性能,因為當表中的數據更改時,所有索引都須進行適當的調整。

查詢注意事項

在創建非聚集索引之前,應先了解訪問數據的方式。考慮對具有以下屬性的查詢使用非聚集索引:

使用 JOIN 或 GROUP BY
子句。

應為聯接和分組操作中所涉及的列創建多個非聚集索引,為任何外鍵列創建一個聚集索引。

不返回大型結果集的查詢。

創建篩選索引以覆蓋從大型表中返回定義完善的行子集的查詢。

包含經常包含在查詢的搜索條件(例如返回完全匹配的 WHERE 子句)中的列。

列注意事項

考慮具有以下一個或多個屬性的列:

覆蓋查詢。

當索引包含查詢中的所有列時,性能可以提升。查詢優化器可以找到索引內的所有列值;不會訪問表或聚集索引數據,這樣就減少了磁碟
I/O 操作。使用具有包含列的索引來添加覆蓋列,而不是創建寬索引鍵。有關詳細信息,請參閱
具有包含列的索引


如果表有聚集索引,則該聚集索引中定義的列將自動追加到表上每個非聚集索引的末端。這可以生成覆蓋查詢,而不用在非聚集索引定義中指定聚集索引列。例如,如果一個表在
C 列上有聚集索引,則 B 和 A 列的非聚集索引將具有其自己的鍵值列 B、A 和 C。

大量非重復值,如姓氏和名字的組合(前提是聚集索引被用於其他列)。

如果只有很少的非重復值,例如僅有 1 和
0,則大多數查詢將不使用索引,因為此時表掃描通常更有效。對於這種類型的數據,應考慮對僅出現在少數行中的非重復值創建篩選索引。例如,如果大部分值都是
0,則查詢優化器可以對包含 1 的數據行使用篩選查詢。

索引選項

在創建非聚集索引時,可以指定若干索引選項。要尤其注意以下選項:

FILLFACTOR

ONLINE

❼ sql 創建一個聚簇索引

樓主給出的語句中,主鍵列P_no會自動創建聚集索引,一個表中最多隻能存在一個聚集索引,所以如果在別的列上建,原來的這個必須刪除,或者改為非聚集

新建聚集索引:
CREATE CLUSTERED INDEX fact_idx
ON Salary (fact);
GO

❽ SQL聚集索引和非聚集索引的區別

聚集索引:也稱 Clustered Index。是指關系表記錄的物理順序與索引的邏輯順序相同。由於一張表只能按照一種物理順序存放,一張表最多也只能存在一個聚集索引。與非聚集索引相比,聚集索引有著更快的檢索速度。
MySQL 里只有 INNODB 表支持聚集索引,INNODB 表數據本身就是聚集索引,也就是常說 IOT,索引組織表。非葉子節點按照主鍵順序存放,葉子節點存放主鍵以及對應的行記錄。所以對 INNODB 表進行全表順序掃描會非常快。
非聚集索引:也叫 Secondary Index。指的是非葉子節點按照索引的鍵值順序存放,葉子節點存放索引鍵值以及對應的主鍵鍵值。MySQL 里除了 INNODB 表主鍵外,其他的都是二級索引。MYISAM,memory 等引擎的表索引都是非聚集索引。簡單點說,就是索引與行數據分開存儲。一張表可以有多個二級索引。
關鍵詞:愛可生、開源資料庫、數據監測、資料庫運維

❾ 如何優化sql語句,怎麼加索引

1、主鍵就是聚集索引2、只要建立索引就能顯著提高查詢速度3、把所有需要提高查詢速度的欄位都加進聚集索引,以提高查詢速度(四)其他書上沒有的索引使用經驗總結1、用聚合索引比用不是聚合索引的主鍵速度快2、用聚合索引比用一般的主鍵作orderby時速度快,特別是在小數據量情況下3、使用聚合索引內的時間段,搜索時間會按數據占整個數據表的百分比成比例減少,而無論聚合索引使用了多少個4、日期列不會因為有分秒的輸入而減慢查詢速度(五)其他注意事項1.不要索引常用的小型表2.不要把社會保障號碼(SSN)或身份證號碼(ID)選作鍵3.不要用用戶的鍵4.不要索引memo/notes欄位和不要索引大型文本欄位(許多字元)5.使用系統生成的主鍵二、改善SQL語句1、Like語句是否屬於SARG取決於所使用的通配符的類型2、or會引起全表掃描3、非操作符、函數引起的不滿足SARG形式的語句4、IN的作用相當與OR5、盡量少用NOT6、exists和in的執行效率是一樣的7、用函數charindex()和前面加通配符%的LIKE執行效率一樣8、union並不絕對比or的執行效率高9、欄位提取要按照「需多少、提多少」的原則,避免「select*」10、count(*)不比count(欄位)慢11、orderby按聚集索引列排序效率最高12、高效的TOP

❿ SQL表欄位如何建立索引難道就是添加SQL查詢語句

1、創建測試表,

create table test_index(id varchar2(20), v_date date);