[英]PostgreSQL analog of SQL Server index(include columns)
試圖在PostgreSQL上重新創建我的SQL Server數據庫。 一切都很好,除了我找不到如何重新創建這個索引:
USE [mytablename]
GO
CREATE NONCLUSTERED INDEX [myindex]
ON [dbo].[mytablename] ([col1],[col2])
INCLUDE ([col3],[col4])
GO
將非常感謝您的幫助。
阿列克謝
更新:
http://img38.imageshack.us/img38/1071/89013974.png這里是db structure star + eav
只有一個查詢
SELECT this_.id as id0_0_,
this_.device_id as device2_0_0_,
this_.time_id as time3_0_0_,
this_.gps_detail_id as gps4_0_0_
FROM [scoutserver_data].[dbo].[DataMessage] this_
WHERE this_.time_id = 65536 and this_.device_id = 32768
也許它不是最佳的atm。 我正在研究它。 也許這樣的事情
SELECT * FROM [scoutserver_data].[dbo].[TimeDimension]
INNER JOIN ([scoutserver_data].[dbo].[DeviceDimension]
INNER JOIN [scoutserver_data].[dbo].[DataMessage]
ON [DeviceDimension].[device_id] =[DataMessage].[device_id])
ON [TimeDimension].[time_id] = [DataMessage].[time_id]
WHERE DeviceDimension.serial_id='2' AND TimeDimension.Day=15 AND TimeDimension.Year=2009
任何提示歡迎=)
CREATE INDEX myindex ON mytablename (co1l, col2, col3, col4)
PostgreSQL
不支持聚簇或覆蓋索引。
更新:
對於此查詢,您需要確實創建建議的索引:
SELECT this_.id as id0_0_,
this_.device_id as device2_0_0_,
this_.time_id as time3_0_0_,
this_.gps_detail_id as gps4_0_0_
FROM DataMessage this_
WHERE this_.time_id = 65536
AND this_.device_id = 32768
CREATE INDEX ix_datamessage_time_device_id_detail ON datamessage (time_id, device_id, id, gps_detail_id)
但是,您的表似乎對我來說過度標准化了。
您可以將年,月和日保存在表中的單個INT
字段中。 這將為您節省一次加入。
如果GpsDetails
很少鏈接到DataMessage
(這是gps_details_id
通常設置為NULL
),或者可以在多個數據消息之間共享GPS詳細信息記錄,則可能需要將DataMessage
和GpsDetails
在單獨的表中。
它不是,將GPS細節移動到數據消息表中會更好。
PostgreSQL 11支持包含的列。 摘自等待PostgreSQL 11 - 包含INCLUDE列的索引及其在B-tree中的支持 :
此修補程序將INCLUDE子句引入索引定義。 此子句指定列的列表,這些列將作為索引中的非鍵部分包含在內。 INCLUDE列僅用於允許更多查詢從僅索引掃描中受益。 此外,此類列不需要具有適當的運算符類。 INCLUDE列不支持表達式,因為它們不能用於僅索引掃描。
目前,只有B樹索引支持INCLUDE子句。
CREATE INDEX myindex ON mytablename (col1,col2) INCLUDE (col3,col4);
編輯:
創建指數 :
[INCLUDE(column_name [,...])]
可選的INCLUDE子句指定將作為非鍵列包含在索引中的列列表。 非鍵列不能用於索引掃描搜索限定,並且出於索引強制執行的任何唯一性或排除約束的目的,它將被忽略。 但是,僅索引掃描可以返回非鍵列的內容,而不必訪問索引表,因為它們可以直接從索引條目中獲得。 因此,添加非鍵列允許僅索引掃描用於否則無法使用它們的查詢。
INCLUDE子句中列出的列不需要適當的運算符類; 該子句可以包括其數據類型沒有為給定訪問方法定義的運算符類的列。
列表不支持表達式,因為它們不能用於僅索引掃描。
目前,只有B樹索引訪問方法支持此功能。 在B樹索引中,INCLUDE子句中列出的列的值包含在與元組對應的葉元組中,但不包括在用於樹導航的上層索引條目中。
PostgreSQL的beta版本現在已經添加了對僅索引掃描的支持。 這意味着如果索引包含查詢中請求的列,則可能不需要轉到基礎數據。 僅索引掃描會自動進行。
僅索引掃描是使用包含列的主要原因。 我不認為postgres(beta或其他)支持包含的列,因此需要將所需的列添加到要編制索引的列的末尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.