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

时间:2009-10-30 13:44:28

标签: sql sql-server database-design postgresql database

尝试在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

任何提示欢迎=)

3 个答案:

答案 0 :(得分:10)

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字段中保留年,月和日。这将为您节省一次加入。

如果DataMessage很少与GpsDetails相关联,可能会将GpsDetailsDataMessage保留在不同的表格中(这是gps_details_id通常设置为NULL),或者可以在多个数据消息之间共享GPS详细信息记录。

不是,最好将GPS细节移动到数据信息表中。

答案 1 :(得分:8)

PostgreSQL 11将支持包含的列。来自Waiting for PostgreSQL 11 – Indexes with INCLUDE columns and their support in B-tree

  

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

     

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

CREATE INDEX myindex ON mytablename (col1,col2) INCLUDE (col3,col4); 

修改

  

CREATE INDEX

     

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

     

可选的INCLUDE子句指定列的列表   作为非键列包含在索引中。非键列不能   用于索引扫描搜索资格,并且它被忽略   任何唯一性或排除约束的目的   指数。但是,仅索引扫描可以返回非键的内容   列,而不必访问索引的表,因为它们是   可直接从索引条目中获取。因此,添加非键   columns允许仅索引扫描用于其他查询   无法使用它们。

     

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

     

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

     

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

答案 2 :(得分:2)

现在已经在PostgreSQL的beta版本中添加了对仅索引扫描的支持。这意味着如果索引包含查询中请求的列,则可能不需要转到基础数据。仅索引扫描会自动发生。

仅索引扫描是使用包含列的主要原因。我不认为postgres(beta或其他)支持包含列,因此需要将所需的列添加到要编制索引的列的末尾。