Огромные целочисленные ключи на SQL сервере - PullRequest
0 голосов
/ 19 апреля 2020

Мне нужно создать таблицу с ключом, который является 256-битным га sh числом. Быстрый поиск и извлечение информации крайне важны, поэтому мне интересно, какую структуру данных использовать в качестве ключа?

Одним из вариантов будет varchar [32], но я думаю, что поиск будет очень медленным. Количество хранимых данных будет намного больше, чем числовое решение.

Второй вариант - два разных десятичных числа [16] и объединение их в составной ключ, но я скептически отношусь к тому, что поиск будет быстрее производительность по сравнению с вариантом № 1.

Я гуглил топи c, но не нашел решения; возможно какой-то третий вариант? Любые советы приветствуются.

1 Ответ

0 голосов
/ 19 апреля 2020

Хорошо, если PRIMARY KEY таблицы - это суррогатный ключ и номер, если это возможно. Использование SMALLINT, ``INT или BIGINT с применением IDENTITY. Использование такого определения:

[RowID] INT IDENTITY(1,1)

поможет вам решить некоторые распространенные проблемы - самое главное, что при создании новых записей они будут добавлены в конце последней индексной страницы, поэтому разделение / фрагментация страницы при вставке не будет. ,

Может быть добавлен дополнительный столбец - ваше значение ha sh и вы можете создать для него индекс, чтобы ускорить поиск на ha sh.

Например, у меня есть IP таблица адресов, содержащая все адреса, используемые в приложении (в основном адреса, используемые пользователями для входа в систему).

Таблица выглядит следующим образом:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[IPAddresses]
(
     [IPAddressID] BIGINT IDENTITY(10000,1) NOT NULL
    ,[IPAddress] VARBINARY(84) NOT NULL
    ,[IPAddressHash] VARBINARY(64) NULL
    ,CONSTRAINT [PK_IPAddresses] PRIMARY KEY
     (
        [IPAddressID] ASC
     )
    ,INDEX [IX_IPAddresses_IPAddressHash] 
    (
        [IPAddressHash] ASC
    )
)
GO

Поскольку IPAddress является персональными данными, это должно быть зашифровано. И так как я хочу, чтобы мои данные были нормализованы, и я не хотел иметь дублированные записи, мне нужно каждый раз проверять, входит ли пользователь в систему, если адрес существует - если не создать его. Я делаю это, используя следующую процедуру:

enter image description here

Здесь я передаю адрес и вычисляю га sh, по которому я ищу. Вместо этого оригинальная версия использовала ha sh для расшифровки всех значений и поиска по тексту, но для миллионов IP-адресов это было очень медленно, и эта процедура выполняется постоянно. С другой стороны, я выполняю только вставки в эту таблицу, а записи добавляются только - так что фрагментации вообще нет.

Итак, мой совет:

  1. номер использования столбец с идентификатором в качестве первичного ключа
  2. добавить остальные столбцы в таблицу
  3. добавить столбец ha sh и построить га sh по столбцам, используемым для поиска
  4. создать индекс для этого столбца ha sh
  5. , затем, когда вам нужно найти запись, используйте ha sh, найдите идентификатор PK и затем используйте идентификатор для извлечения запись
...