PostgreSQL模拟SQL Server索引(包括列)

Ale*_*iev 9 sql database sql-server postgresql database-design

试图在PostgreSQL上重新创建我的SQL Server数据库.一切都很好,除了我找不到如何重新创建这个索引:

USE [mytablename]  
GO  
CREATE NONCLUSTERED INDEX [myindex]  
ON [dbo].[mytablename] ([col1],[col2])  
INCLUDE ([col3],[col4])  
GO  
Run Code Online (Sandbox Code Playgroud)

将非常感谢您的帮助.

阿列克谢

更新:

http://img38.imageshack.us/img38/1071/89013974.png这里是db结构的明星+ 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  
Run Code Online (Sandbox Code Playgroud)

也许它不是最佳的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
Run Code Online (Sandbox Code Playgroud)

任何提示欢迎=)

Qua*_*noi 10

CREATE INDEX myindex ON mytablename (co1l, col2, col3, col4)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

但是,您的表似乎对我来说过度标准化了.

您可以INT在表格中的单个字段中保留年,月和日.这将为您节省一次加入.

如果很少链接到(通常设置为),或者可以在多个数据消息之间共享GPS详细信息记录,则可能存在保留点DataMessageGpsDetails单独的表.GpsDetailsDataMessagegps_details_idNULL

它不是,将GPS细节移动到数据消息表中会更好.

  • @cdhowie:是什么让你认为这个命令会创建一个聚集索引? (2认同)
  • @cdhowie:它没有.它只是重新排序堆并标记索引,以便下次执行`CLUSTER`时可以省略`USING index_name`部分.堆仍然是一个堆,并且在对表执行`INSERT`或`UPDATE`后,它的顺序不会被维护.使用聚簇索引,所有表数据都存储在"B-Tree"或维护订单的其他结构中. (2认同)
  • @cdhowie:如果你看问题标题,你会很容易找到在哪里寻找正确的定义.`PostgreSQL`不支持聚簇索引:它不能将表记录存储在`B-Tree`或任何其他订单维护结构中; 它们在"聚集"之后不保留记录的顺序; 它甚至不能在运行`CLUSTER`命令后立即依赖记录的顺序(你仍然会在计划中看到`sort`).不要被称为"CLUSTER"的命令所迷惑:不同的数据库称这完全不相关的事情. (2认同)

Luk*_*zda 10

PostgreSQL 11将支持包含的列.从等待PostgreSQL 11 - 带有INCLUDE列的索引及其在B树中的支持:

此修补程序将INCLUDE子句引入索引定义.此子句指定列的列表,这些列将作为索引中的非键部分包含在内.INCLUDE列仅用于允许更多查询从仅索引扫描中受益.此外,此类列不需要具有适当的运算符类.INCLUDE列不支持表达式,因为它们不能用于仅索引扫描.

目前,只有B树索引支持INCLUDE子句.

CREATE INDEX myindex ON mytablename (col1,col2) INCLUDE (col3,col4); 
Run Code Online (Sandbox Code Playgroud)

编辑:

创建指数:

[INCLUDE(column_name [,...])]

可选的INCLUDE子句指定将作为非键列包含在索引中的列列表.非键列不能用于索引扫描搜索限定,并且出于索引强制执行的任何唯一性或排除约束的目的,它将被忽略.但是,仅索引扫描可以返回非键列的内容,而不必访问索引表,因为它们可以直接从索引条目中获得.因此,添加非键列允许仅索引扫描用于否则无法使用它们的查询.

INCLUDE子句中列出的列不需要适当的运算符类; 该子句可以包括其数据类型没有为给定访问方法定义的运算符类的列.

列表不支持表达式,因为它们不能用于仅索引扫描.

目前,只有B树索引访问方法支持此功能.在B树索引中,INCLUDE子句中列出的列的值包含在与元组对应的叶元组中,但不包括在用于树导航的上层索引条目中.