繁体   English   中英

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

[英]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详细信息记录,则可能需要将DataMessageGpsDetails在单独的表中。

它不是,将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM