У меня есть таблица пациентов с более чем 80 полями, из которых мне нужно хранить исторические данные по всем полям. Для уточнения, не все поля «нуждаются» в версионировании, хотя было принято решение просто сохранить полную копию старых записей.
Для пояснения, это для процесса ETL, который будет происходить в нерабочее время.
Кажется, здесь есть несколько подходов, хотя я не знаю, какой из них подойдет мне лучше всего, так как я не делал этого раньше.
Вариант 1: используйте SSIS для реализации SCD.
За: поскольку мы все равно используем SSIS для получения наших данных, имеет смысл просто продолжать использовать тот же инструмент
Против: Я прочитал несколько статей о производительности SCD в SSIS, например: https://chrisjarrintaylor.co.uk/2012/07/03/ssis-scd-vs-merge-statement-performance-comparison./
Вариант 2. Используйте MERGE
в операторе tsql.
Плюсы: краткость написания, простота понимания — все шаги выполняются за один раз
Минусы: может быть громоздко, если мы попытаемся написать условия для 80+ полей. У нас также может возникнуть проблема с производительностью при выполнении OR
для такого количества полей (например, если они отличаются)
Следующий подход сработал бы для меня, хотя запись таким образом означала бы очень длинный оператор слияния: Нужна помощь в понимании альтернатив scd в SSIS
Вариант 3: INSERT
все новые записи, используйте CTE для очистки дубликатов (тех, в которых нет изменений), оператор UPDATE
для деактивации тех записей, которые изменились
Pro: никаких запутанных OR
операторов , не слишком сложно написать или понять - производительность, кажется, не будет проблемой (мы использовали подход CTE в прошлом)
Против: Почему-то это кажется очень неуклюжим подходом.
Учитывая эти подходы или другие, которые у вас могут быть, есть ли тот, который легче поддерживать, будет лучше масштабироваться?
Небольшая выборка данных - в исходных данных более 80 столбцов (которые я не могу контролировать) и гораздо больше строк: http://rextester.com/live/AYQUT28070