У нас есть список из 50 таблиц в «SQL Server-A» на «PC-A» и те же 50 таблиц в «SQL server-B» на «PC-B», оба соединены вместе в сети.
«SQL server-A» выступает в роли промежуточной, так как напрямую связан с датчиками. Программа python пытается перенести все данные из 50 таблиц в «SQL Server-A» в «SQL Server-B» каждый час («каждый час, данные за последние 2 часа будут передаваться постепенно»). При передаче, как избежать вставки строки в таблицы «SQL Server-B», если строка уже существует в таблицах?
Ранее мы использовали PostgreSQL вместо «сервера-B». Мы использовали массовый перенос данных за 2 часа в таблицу «Temp» PostgreSQL, а затем из таблицы «Temp» мы вставляем в фактическую таблицу с запросом «при конфликте ничего не делать». Каков его эквивалент в SQL Server?
Например: таблица в «Сервер-А» и БД: БД-1 и Таблица: Таблица-1 [здесь столбец «ID» является первичным ключом]
ID Name Value Timestamp
1 X 12 2022-02-14 09:46:24.840
2 Y 15 2022-02-14 09:47:24.840
3 A 35 2022-02-14 09:48:24.840
4 B 56 2022-02-14 09:49:24.840
5 C 86 2022-02-14 09:50:24.840
Таблица в «Сервере-B» и БД: БД-1 и Таблица: Таблица-1
ID Name Value Timestamp
1 X 12 2022-02-14 09:46:24.840
2 Y 15 2022-02-14 09:47:24.840
3 A 35 2022-02-14 09:48:24.840
Нужно вставить только идентификаторы 4 и 5 в таблицу 1 DB-1 на сервере B и пропустить идентификаторы 1,2 и 3. Как лучше всего передать это в SQL, поскольку таблицы на сервере B содержат миллионы строк?
таблица назначения огромна. это лучший способ сделать массовый перенос всех 50 столов каждый час?
Дайте определение «огромному», @Nandan. SQL Server может тривиально обрабатывать миллионы строк в одном операторе. При условии, что ваши столбцы первичного ключа правильно проиндексированы, EXISTS будет очень производительным. Однако, если вы хотите копировать данных, то, на мой взгляд, вам следует обратить внимание на зеркалирование/репликацию.
Каждая из 50 таблиц содержит более 15 тысяч строк, и со временем она будет увеличиваться. если я проверю EXISTS первичного ключа. смогу ли я вводить 5000 строк каждый час для всех 50 таблиц?
Я не знаю, что такое «лакх», но если это не означает 10 миллионов или более, у SQL Server не возникнет проблем с обработкой этих нескольких строк.
(Я мог бы поклясться, что снова открыл это после того, как закрыл его. Кофе не закипел достаточно, чтобы напомнить мне, что я поставлю его золотым значком, когда внес предложение. Извиняюсь. Время для второго кофе)
@Larnu - «Лакх» - это термин из Индии. Значит 10**5, или 100_000.






Earlier we used PostgreSQL in place "server-B". We used bulk transfer 2 hour data to PostgreSQL "Temp" table and then from "Temp" table we insert to actual table with query "on Conflict do nothing". What is its equivalent in SQL Server?
Для PostgreSQL INSERT с ON CONFLICT DO NOTHING лайком
INSERT INTO tbl_main (id, txt)
SELECT id, txt FROM tbl_temp
ON CONFLICT DO NOTHING
(один столбец PK на id) эквивалент в T-SQL будет
INSERT INTO tbl_main (id, txt)
SELECT id, txt FROM tbl_temp
WHERE id NOT IN (SELECT id FROM tbl_main)
Является ли решение, предоставленное для T-SQL «WHERE id NOT IN (SELECT id FROM tbl_main)», лучшим способом, или есть ли какая-либо другая процедура, которую я могу сделать, чтобы работать еще лучше?
Используйте
EXISTSи отфильтруйте данные, которые вы не хотитеINSERT/UPDATE.