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详细信息记录,则可能存在保留点DataMessage和GpsDetails单独的表.GpsDetailsDataMessagegps_details_idNULL
它不是,将GPS细节移动到数据消息表中会更好.
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子句中列出的列的值包含在与元组对应的叶元组中,但不包括在用于树导航的上层索引条目中.
| 归档时间: |
|
| 查看次数: |
5495 次 |
| 最近记录: |