Как эффективно заменить длинные строки их индексом для вставок SQL Server? - PullRequest
0 голосов
/ 19 сентября 2019

У меня очень большой DataTable -объект, который мне нужно импортировать из клиента в базу данных MS SQL-Server через ODBC.

Исходная таблица данных состоит из двух столбцов: * Первый столбецOffice Location (довольно длинная строка) * Второй столбец - это booking value (целое число)

. Сейчас я ищу наиболее эффективный способ вставить эти данные во внешний SQL-сервер.Моя цель состоит в том, чтобы заменить каждое местоположение офиса автоматически индексом, вместо этого используя полную строку, потому что каждое местоположение встречается ОЧЕНЬ часто в исходной таблице.

Возможно ли это с помощью триггера или через просмотр SQL-сервера?

В конце я хочу вставить данные, не касаясь их в моем скрипте, потому что это очень медленно для этих больших объемов данных и позволяет выполнить оптимизацию, выполняемую SQL Server.

Я ожидаючто если я сделаю INSERT данных, включая расположение Office, SQL Server ищет индекс для уже импортированного расположения, а затем использует только этот индекс.И если местоположение еще не существовало в таблице / представлении индекса, здесь следует создать новую запись и затем использовать новый индекс.

Здесь образец данных, которые мне нужно импортировать через ODBC в SQL-Server:

OfficeLocation             | BookingValue
EU-Germany-Hamburg-Ostend1 | 12
EU-Germany-Hamburg-Ostend1 | 23
EU-Germany-Hamburg-Ostend1 | 34
EU-France-Paris-Eifeltower | 42
EU-France-Paris-Eifeltower | 53
EU-France-Paris-Eifeltower | 12

В результате на SQL-сервере мне нужно что-то вроде этих двух таблиц:

OId|BookingValue      OfficeLocation             |Oid
  1|12                EU-Germany-Hamburg-Ostend1 | 1
  1|23                EU-France-Paris-Eifeltower | 2
  1|43
  2|42
  2|53
  2|12

Моя первоначальная идея заключалась в том, чтобы записать данные ввременная таблица и что-то вроде интеллектуального TRIGGER (или VIEW?) для реагирования на любую вставку в эту таблицу для создания 2 желаемых (оптимизированных) таблиц.

Любая подсказка приветствуется!

1 Ответ

1 голос
/ 20 сентября 2019

Да, вы можете создать представление с триггером INSERT, чтобы справиться с этим.Что-то вроде:

CREATE TABLE dbo.Locations (
    OId int IDENTITY(1,1) not null PRIMARY KEY,
    OfficeLocation varchar(500) not null UNIQUE
)
GO
CREATE TABLE dbo.Bookings (
    OId int not null,
    BookingValue int not null
)
GO
CREATE VIEW dbo.CombinedBookings
WITH SCHEMABINDING
AS
    SELECT
        OfficeLocation,
        BookingValue
    FROM
        dbo.Bookings b
            INNER JOIN
        dbo.Locations l
            ON
                b.OId = l.OId
GO
CREATE TRIGGER CombinedBookings_Insert
ON dbo.CombinedBookings
INSTEAD OF INSERT
AS
    INSERT INTO Locations (OfficeLocation)
    SELECT OfficeLocation
    FROM inserted where OfficeLocation not in (select OfficeLocation from Locations)

    INSERT INTO Bookings (OId,BookingValue)
    SELECT OId, BookingValue
    FROM
          inserted i
              INNER JOIN
          Locations l
              ON
                  i.OfficeLocation = l.OfficeLocation

Как вы видите, мы сначала добавляем в таблицу местоположений все недостающие местоположения, а затем заполняем таблицу заказов.

Подобный триггер может справиться с обновлениями.Обычно я позволяю таблице Locations просто расти и не пытаться очистить ее (для уже не упомянутых местоположений) с помощью триггеров.Если рост вызывает беспокойство, периодическое задание обычно будет достаточно хорошим.

Имейте в виду, что некоторые инструменты (например, массовые вставки) могут не вызывать триггеры, поэтому они не будут использоваться в представлении выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...