尝试在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
任何提示欢迎=)
答案 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
相关联,可能会将GpsDetails
和DataMessage
保留在不同的表格中(这是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);
修改强>
[INCLUDE(column_name [,...])]
可选的INCLUDE子句指定列的列表 作为非键列包含在索引中。非键列不能 用于索引扫描搜索资格,并且它被忽略 任何唯一性或排除约束的目的 指数。但是,仅索引扫描可以返回非键的内容 列,而不必访问索引的表,因为它们是 可直接从索引条目中获取。因此,添加非键 columns允许仅索引扫描用于其他查询 无法使用它们。
INCLUDE子句中列出的列不需要适当的运算符类;该子句可以包含其数据类型的列 没有为给定的访问方法定义运算符类。
列表不支持表达式,因为它们不能用于仅索引扫描。
目前,只有B树索引访问方法支持此功能。在B树索引中,列出的列的值 INCLUDE子句包含在与元组对应的叶元组中 元组,但不包括在用于的上层索引条目中 树导航。
答案 2 :(得分:2)
现在已经在PostgreSQL的beta版本中添加了对仅索引扫描的支持。这意味着如果索引包含查询中请求的列,则可能不需要转到基础数据。仅索引扫描会自动发生。
仅索引扫描是使用包含列的主要原因。我不认为postgres(beta或其他)支持包含列,因此需要将所需的列添加到要编制索引的列的末尾。