PostgreSQL аналог индекса SQL Server (включая столбцы) - PullRequest
8 голосов
/ 30 октября 2009

Попытка воссоздать мою базу данных SQL Server на PostgreSQL. Все в порядке, за исключением того, что я не могу найти, как воссоздать этот индекс:

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 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  

Может быть, это не оптимально. И я работаю над этим также. Может быть, что-то вроде этого

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 ]

10 голосов
/ 30 октября 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 в своей таблице. Это спасет вас от присоединения.

Может быть смысл хранить DataMessage и GpsDetails в отдельных таблицах, если либо GpsDetails редко связаны с DataMessage (то есть gps_details_id часто устанавливается на NULL), либо запись сведений GPS может быть разделена между несколькими сообщениями данных.

Если это не так, то лучше перенести данные GPS в таблицу сообщений данных.

9 голосов
/ 29 апреля 2018

PostgreSQL 11 поддерживает включенные столбцы. Выдержка из Ожидание PostgreSQL 11 - индексы со столбцами INCLUDE и их поддержка в B-дереве :

Этот патч вводит предложение INCLUDE для определения индекса. Этот пункт указывает список столбцов, которые будут включены в качестве неключевой части в индекс. Столбцы INCLUDE существуют исключительно для того, чтобы больше запросов извлечь выгоду из сканирования только по индексу Кроме того, такие столбцы не должны иметь соответствующие классы операторов. Выражения не поддерживаются как INCLUDE столбцы, поскольку они не могут быть использованы при сканировании только по индексу.

На данный момент, только индексы B-дерева поддерживают предложение INCLUDE.

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

EDIT:

ИНДЕКС СОЗДАНИЯ :

[ВКЛЮЧИТЬ (имя столбца [, ...])]

Необязательное предложение INCLUDE указывает список столбцов, которые будут включены в индекс в качестве неключевых столбцов. Неключевой столбец не может быть используется в квалификации поиска по индексу сканирования и не учитывается для целей любого ограничения уникальности или исключения, навязанного индекс. Однако сканирование только по индексу может вернуть содержимое неключевых столбцы без необходимости посещать таблицу индекса, так как они доступны непосредственно из индексной записи. Таким образом, добавление неключевых столбцы позволяют сканировать только по индексу для запросов, которые в противном случае не мог их использовать.

Столбцы, перечисленные в предложении INCLUDE, не нуждаются в соответствующих классах операторов; предложение может включать столбцы, чьи типы данных не определены классы операторов для данного метода доступа.

Выражения не поддерживаются в качестве включенных столбцов, поскольку их нельзя использовать при сканировании только по индексу.

В настоящее время только метод доступа к индексу B-дерева поддерживает эту функцию. В индексах B-дерева значения столбцов, перечисленные в Предложение INCLUDE включено в кортежи листьев, которые соответствуют куче кортежи, но не включены в индексные записи верхнего уровня, используемые для древовидная навигация.

2 голосов
/ 15 мая 2012

В бета-версию PostgreSQL добавлена ​​поддержка сканирования только по индексу. Это означает, что если индекс содержит столбцы, запрошенные в запросе, ему, скорее всего, не нужно переходить к базовым данным. Сканирование только по индексу происходит автоматически.

Сканирование только по индексу является основной причиной использования включенных столбцов. Я не думаю, что postgres (бета или иным образом) поддерживает включенные столбцы, поэтому вместо индекса нужно добавить нужные столбцы в конец списка столбцов.

...