Поделиться через


Создание индексов SQL Server

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

Скачать драйвер OLE DB

Драйвер OLE DB для SQL Server предоставляет функцию IIndexDefinition::CreateIndex , позволяя потребителям определять новые индексы в таблицах SQL Server.

OLE DB Driver for SQL Server создает табличные индексы в формате индексов или ограничений. SQL Server предоставляет права на создание ограничений владельцу таблицы, владельцу базы данных и членам определенных административных ролей. По умолчанию только владелец таблицы может создавать в ней индекс. Таким образом, успех или сбой функции CreateIndex зависит не только от прав доступа пользователя приложения, но и от типа создаваемого индекса.

Пользователь задает имя таблицы в виде символьной строки в Юникоде в элементе pwszName объединения uName в параметре pTableID. Элемент eKind параметра pTableID должен быть равен DBKIND_NAME.

Параметр pIndexID может иметь значение NULL, и в этом случае драйвер OLE DB для SQL Server создает для индекса уникальное имя. Потребитель может сам задать имя индекса, указав для DBID допустимый указатель в параметре ppIndexID.

Потребитель может задать имя индекса в виде символьной строки в Юникоде в элементе pwszName объединения uName параметра pIndexID. Элемент eKind параметра pIndexID должен быть равен DBKIND_NAME.

Потребитель указывает столбец или столбцы, входящие в индекс, по имени. Для каждой структуры DBINDEXCOLUMNDESC, используемой в функции CreateIndex, элемент eKind параметра pColumnID должен быть DBKIND_NAME. Имя столбца задается в виде символьной строки в Юникоде в элементе pwszName объединения uName параметра pColumnID.

Драйвер OLE DB для SQL Server и SQL Server поддерживает порядок возрастания значений в индексе. Драйвер OLE DB для SQL Server возвращает значение E_INVALIDARG, если потребитель указывает значение DBINDEX_COL_ORDER_DESC в любой структуре DBINDEXCOLUMNDESC.

Функция CreateIndex интерпретирует свойства индекса указанным ниже образом.

Идентификатор свойства Description
DBPROP_INDEX_AUTOUPDATE R/W: чтение и запись

По умолчанию: нет

Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_CLUSTERED R/W: чтение и запись

По умолчанию: VARIANT_FALSE

Описание. Управляет кластеризациям индексов.

VARIANT_TRUE. Драйвер OLE DB для SQL Server пытается создать кластеризованный индекс в таблице SQL Server. SQL Server поддерживает не более одного кластеризованного индекса в любой таблице.

VARIANT_FALSE. Драйвер OLE DB для SQL Server пытается создать некластеризованный индекс в таблице SQL Server.
DBPROP_INDEX_FILLFACTOR R/W: чтение и запись

По умолчанию: 0

Описание: указывает процент страниц индекса, используемых для хранения. Дополнительные сведения см. в разделе CREATE INDEX.

Тип варианта — VT_I4. Значение должно находиться в диапазоне от 1 до 100.
DBPROP_INDEX_INITIALIZE R/W: чтение и запись

По умолчанию: нет

Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_NULLCOLLATION R/W: чтение и запись

По умолчанию: нет

Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_NULLS R/W: чтение и запись

По умолчанию: нет

Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_PRIMARYKEY R/W: чтение и запись

По умолчанию: VARIANT_FALSE Описание: создает индекс в качестве ограничения целостности ссылочных данных, ограничения PRIMARY KEY.

VARIANT_TRUE: индекс создается для поддержки ограничения PRIMARY KEY таблицы. Столбцы не должны иметь значений NULL.

VARIANT_FALSE: индекс не используется в качестве ограничения PRIMARY KEY для значений строк таблицы.
DBPROP_INDEX_SORTBOOKMARKS R/W: чтение и запись

По умолчанию: нет

Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_TEMPINDEX R/W: чтение и запись

По умолчанию: нет

Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_TYPE R/W: чтение и запись

По умолчанию: нет

Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_UNIQUE R/W: чтение и запись

По умолчанию: VARIANT_FALSE

Описание: создает индекс в виде ограничения UNIQUE для определенного столбца или столбцов.

VARIANT_TRUE: индекс используется для уникального ограничения значений в строках таблицы.

VARIANT_FALSE: индекс не используется для уникального ограничения значений строк.

В специфичном для каждого поставщика множестве свойств DBPROPSET_SQLSERVERINDEX драйвер OLE DB для SQL Server определяет указанное ниже свойство, хранящее информацию об источнике данных.

Идентификатор свойства Description
SSPROP_INDEX_XML Тип: VT_BOOL (R/W)

По умолчанию: VARIANT_FALSE

Описание: если при вызове метода IIndexDefinition::CreateIndex это свойство указывается со значением VARIANT_TRUE, создается первичный XML-индекс, соответствующий индексированному столбцу. Если это свойство имеет значение VARIANT_TRUE, параметр cIndexColumnDescs должен быть равен 1. В противном случае возникает ошибка.

В данном примере создается индекс первичного ключа.

// This CREATE TABLE statement shows the referential integrity and   
// PRIMARY KEY constraint on the OrderDetails table that will be created   
// by the following example code.  
//  
// CREATE TABLE OrderDetails  
// (  
//    OrderID      int      NOT NULL  
//    ProductID   int      NOT NULL  
//        CONSTRAINT PK_OrderDetails  
//        PRIMARY KEY CLUSTERED (OrderID, ProductID),  
//    UnitPrice   money      NOT NULL,  
//    Quantity   int      NOT NULL,  
//    Discount   decimal(2,2)   NOT NULL  
//        DEFAULT 0  
// )  
//  
HRESULT CreatePrimaryKey  
    (  
    IIndexDefinition* pIIndexDefinition  
    )  
    {  
    HRESULT             hr = S_OK;  
  
    DBID                dbidTable;  
    DBID                dbidIndex;  
    const ULONG         nCols = 2;  
    ULONG               nCol;  
    const ULONG         nProps = 2;  
    ULONG               nProp;  
  
    DBINDEXCOLUMNDESC   dbidxcoldesc[nCols];  
    DBPROP              dbpropIndex[nProps];  
    DBPROPSET           dbpropset;  
  
    DBID*               pdbidIndexOut = NULL;  
  
    // Set up identifiers for the table and index.  
    dbidTable.eKind = DBKIND_NAME;  
    dbidTable.uName.pwszName = L"OrderDetails";  
  
    dbidIndex.eKind = DBKIND_NAME;  
    dbidIndex.uName.pwszName = L"PK_OrderDetails";  
  
    // Set up column identifiers.  
    for (nCol = 0; nCol < nCols; nCol++)  
        {  
        dbidxcoldesc[nCol].pColumnID = new DBID;  
        dbidxcoldesc[nCol].pColumnID->eKind = DBKIND_NAME;  
  
        dbidxcoldesc[nCol].eIndexColOrder = DBINDEX_COL_ORDER_ASC;  
        }  
    dbidxcoldesc[0].pColumnID->uName.pwszName = L"OrderID";  
    dbidxcoldesc[1].pColumnID->uName.pwszName = L"ProductID";  
  
    // Set properties for the index. The index is clustered,  
    // PRIMARY KEY.  
    for (nProp = 0; nProp < nProps; nProp++)  
        {  
        dbpropIndex[nProp].dwOptions = DBPROPOPTIONS_REQUIRED;  
        dbpropIndex[nProp].colid = DB_NULLID;  
  
        VariantInit(&(dbpropIndex[nProp].vValue));  
  
        dbpropIndex[nProp].vValue.vt = VT_BOOL;  
        }  
    dbpropIndex[0].dwPropertyID = DBPROP_INDEX_CLUSTERED;  
    dbpropIndex[0].vValue.boolVal = VARIANT_TRUE;  
  
    dbpropIndex[1].dwPropertyID = DBPROP_INDEX_PRIMARYKEY;  
    dbpropIndex[1].vValue.boolVal = VARIANT_TRUE;  
  
    dbpropset.rgProperties = dbpropIndex;  
    dbpropset.cProperties = nProps;  
    dbpropset.guidPropertySet = DBPROPSET_INDEX;  
  
    hr = pIIndexDefinition->CreateIndex(&dbidTable, &dbidIndex, nCols,  
        dbidxcoldesc, 1, &dbpropset, &pdbidIndexOut);  
  
    // Clean up dynamically allocated DBIDs.  
    for (nCol = 0; nCol < nCols; nCol++)  
        {  
        delete dbidxcoldesc[nCol].pColumnID;  
        }  
  
    return (hr);  
    }  

См. также

Таблицы и индексы