SQL Server에서 효과적으로 열을 추가하고 행을 업데이트하는 방법

Temp mail SuperHeros
SQL Server에서 효과적으로 열을 추가하고 행을 업데이트하는 방법
SQL Server에서 효과적으로 열을 추가하고 행을 업데이트하는 방법

SQL Server의 테이블 수정 마스터링: 단계별 가이드

때로는 대규모 데이터 세트를 사용하여 작업하는 것이 한 번에 수백 가지 작업을 저글링하는 것처럼 느껴질 수 있습니다. 최근에 저는 백만 개가 넘는 행이 포함된 테이블에 열을 추가해야 하는 상황에 처했습니다. 표면적으로는 간단한 작업처럼 보였지만 많은 SQL Server 사용자가 직면하는 두려운 "잘못된 열 이름" 오류라는 장애물에 곧 부딪혔습니다. 🧐

ALTER TABLE 및 UPDATE 명령을 함께 실행하려고 여러 번 시도한 후에 문제는 논리가 아니라 쿼리 순서에 있다는 것을 깨달았습니다. SQL Server에서는 먼저 열을 추가하고 데이터로 업데이트하기 전에 해당 변경 사항을 커밋해야 합니다. 그렇지 않으면 업데이트가 실행될 때 시스템이 새로 추가된 열을 인식하지 못하기 때문에 오류가 발생합니다.

예를 들어, 대규모 고객 데이터베이스의 특정 날짜 임계값을 기반으로 "IS_CURRENT" 플래그를 업데이트하는 임무를 맡고 있다고 가정해 보겠습니다. 열을 추가하고 단일 스크립트에서 행을 업데이트하려고 하면 SQL Server에서 "잘못된 열 이름" 오류가 발생할 수 있습니다. 이는 업데이트 쿼리가 열을 사용하려고 시도하기 전에 열이 완전히 커밋되지 않았기 때문입니다. 🚀

이 문서에서는 열을 추가하고 행을 업데이트하는 적절한 순서를 살펴보고 대규모 데이터 세트에서도 원활한 실행을 보장합니다. 또한 수백만 개의 행을 효율적으로 처리하여 데이터 작업이 문제 없이 실행되도록 SQL 스크립트를 최적화하는 방법에 대해 자세히 알아봅니다. 단계를 탐색하고 그 과정에서 일반적인 문제를 해결하는 동안 계속 지켜봐 주시기 바랍니다!

명령 사용예
ALTER TABLE 이 명령은 새 열을 추가하는 등 기존 테이블의 구조를 수정하는 데 사용됩니다. 예를 들어 `ALTER TABLE dbo.sample ADD IS_CURRENT BIT;`는 `dbo.sample` 테이블에 `IS_CURRENT`라는 새 열을 추가합니다.
UPDATE 'UPDATE' 명령은 테이블의 기존 레코드를 수정하는 데 사용됩니다. 예를 들어 `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
CAST SQL Server에서는 'CAST'를 사용하여 한 데이터 형식을 다른 데이터 형식으로 변환합니다. 예제에서 `CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(DAY, -60, GETDATE())), 0) AS DATE)`는 날짜 조작 결과를 날짜 유형으로 변환합니다.
DATEADD 이 기능은 날짜에 특정 시간 간격을 추가하는 데 사용됩니다. 예를 들어 `DATEADD(DAY, -60, GETDATE())`는 현재 날짜에서 60일을 뺍니다.
DATEDIFF 'DATEDIFF' 함수는 두 날짜의 차이를 계산합니다. 이 경우 `DATEDIFF(month, 0, GETDATE())`는 기준일(0, 즉 '1900-01-01')과 현재 날짜 사이의 개월 수를 찾습니다.
BEGIN TRANSACTION 이 명령은 트랜잭션 블록을 시작합니다. 이는 여러 SQL 문이 단일 단위로 실행되어 데이터 무결성을 유지하는 데 필수적입니다. `BEGIN TRANSACTION;`은 트랜잭션을 시작하며 모든 변경 사항을 커밋하거나 롤백할 수 있습니다.
COMMIT TRANSACTION 트랜잭션 중에 발생한 모든 변경 사항을 데이터베이스에 저장하는 데 사용됩니다. `COMMIT TRANSACTION;`은 `BEGIN TRANSACTION` 블록 내부의 모든 변경 사항이 완료되고 지속되도록 보장합니다.
UPDATE TOP 이 버전의 `UPDATE` 명령은 업데이트의 영향을 받는 행 수를 제한하는 데 사용됩니다. 예를 들어 `UPDATE TOP (10000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
EXEC msdb.dbo.sp_add_job 이 저장 프로시저는 SQL Server 에이전트에서 새 작업을 만드는 데 사용됩니다. `EXEC msdb.dbo.sp_add_job @job_name = 'IS_CURRENT Job 업데이트';`는 특정 SQL 명령을 자동으로 실행하도록 예약할 수 있는 작업을 생성합니다.

테이블 변경 및 행 업데이트를 위한 SQL Server 명령 이해

SQL Server로 작업할 때, 특히 대규모 데이터 세트가 포함된 테이블을 사용하는 경우 테이블을 변경하고 해당 행을 업데이트하기 위해 질서 있는 접근 방식을 따르는 것이 중요합니다. 일반적인 시나리오 중 하나는 테이블에 새 열을 추가한 다음 날짜를 기반으로 플래그를 설정하는 것과 같이 특정 조건을 기반으로 행을 업데이트해야 하는 것입니다. 제가 제공한 스크립트는 이에 대한 간단한 접근 방식을 보여 주지만 이러한 작업을 효율적으로 수행하는 데 필수적인 주요 SQL Server 명령을 강조합니다. 그만큼 테이블 변경 명령은 테이블에 새 열을 추가하는 데 사용됩니다. 예를 들어 `ALTER TABLE dbo.sample ADD IS_CURRENT BIT;`를 실행하면 테이블 구조를 수정하여 `BIT` 유형(부울 유형, 0 또는 1)의 `IS_CURRENT`라는 새 열을 도입합니다.

열을 추가한 후 다음 단계는 특정 조건에 따라 테이블의 행을 업데이트하는 것입니다. 이는 다음을 사용하여 달성됩니다. 업데이트 명령. 예를 들어 쿼리 `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE

어떤 경우에는 특히 수백만 개의 행이 포함된 대규모 테이블을 처리할 때 SQL 명령이 효율적으로 실행되는지 확인하는 것이 중요합니다. 이것은 다음과 같은 기능이 있는 곳입니다. 날짜추가 그리고 날짜 DATEIFF 플레이에 참여하세요. 이 함수를 사용하면 날짜를 정확하게 조작하고 비교할 수 있습니다. 두 번째 업데이트 쿼리에서는 `DATEADD(month, DATEDIFF(month, 0, DATEADD(DAY, -60, GETDATE())), 0)`는 현재 날짜(`GETDATE()`)에서 60일을 빼고 날짜를 재설정합니다. 달의 시작 시간. 이러한 기능을 사용하면 시간이 지남에 따라 조정되는 보다 동적인 날짜 범위를 정의하여 데이터가 오래되어도 최신 상태를 유지할 수 있습니다.

그러나 `ALTER TABLE` 및 `UPDATE` 문을 단일 스크립트로 결합하면 SQL Server에서 "잘못된 열 이름" 오류가 발생할 수 있습니다. 이는 `ALTER TABLE`에 의해 추가된 열이 동일한 일괄 처리에서 후속 쿼리를 실행하는 동안 SQL Server에서 완전히 커밋되거나 인식되지 않을 수 있기 때문에 발생합니다. 이 문제에 대한 해결책은 'ALTER TABLE' 문과 'UPDATE' 명령을 분리하여 업데이트를 수행하기 전에 테이블 변경이 완전히 커밋되었는지 확인하는 것입니다. 이렇게 하면 SQL Server의 스키마에 새 열이 제대로 등록되어 테이블을 원활하게 업데이트할 수 있습니다. 대규모 데이터세트를 처리할 때는 이러한 작업을 일괄적으로 실행하거나 트랜잭션을 사용하여 프로세스가 최대한 효율적이도록 하고 잠재적인 시간 초과나 잠금을 방지하는 것을 고려하세요. 🚀

해결 방법 1: 테이블 변경 및 행 업데이트에 대한 표준 접근 방식

이 솔루션에는 먼저 열을 추가한 다음 적절한 조건으로 행을 업데이트하는 SSMS(SQL Server Management Studio)를 사용하는 표준 접근 방식이 포함됩니다. 업데이트를 수행하기 전에 ALTER TABLE 문을 실행하고 커밋합니다.

ALTER TABLE dbo.sample ADD IS_CURRENT BIT;
GO
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE < '2025-01-01';
GO
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE >= CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(DAY, -60, GETDATE())), 0) AS DATE);
GO

솔루션 2: 원자성을 위한 트랜잭션을 사용한 최적화된 접근 방식

이 솔루션을 사용하면 테이블 수정 및 행 업데이트가 원자적으로 수행됩니다. 작업을 트랜잭션으로 래핑함으로써 실패 시 일관성과 롤백을 보장합니다.

BEGIN TRANSACTION;
ALTER TABLE dbo.sample ADD IS_CURRENT BIT;
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE < '2025-01-01';
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE >= CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(DAY, -60, GETDATE())), 0) AS DATE);
COMMIT TRANSACTION;

솔루션 3: 대규모 데이터 세트에 대한 일괄 처리를 사용한 접근 방식

백만 개 이상의 행이 포함된 테이블을 처리할 때는 잠금을 최소화하고 트랜잭션 크기를 줄이는 것이 중요합니다. 이 솔루션은 업데이트를 더 작은 배치로 처리하여 성능을 향상하고 시간 초과를 방지합니다.

DECLARE @BatchSize INT = 10000;
DECLARE @RowCount INT;
SELECT @RowCount = COUNT(*) FROM dbo.sample WHERE IS_CURRENT IS ;
WHILE @RowCount > 0
BEGIN
    UPDATE TOP (@BatchSize) dbo.sample
    SET IS_CURRENT = 0
    WHERE LOAD_DATE < '2025-01-01' AND IS_CURRENT IS ;
    SET @RowCount = @RowCount - @BatchSize;
END

해결 방법 4: 성능 향상을 위해 인덱싱된 뷰 사용

대규모 데이터 세트를 쿼리할 때 성능을 향상시키기 위해 SQL Server에서 인덱싱된 뷰를 만들 수 있습니다. 이 접근 방식은 구체화된 뷰를 활용하여 복잡한 쿼리 결과를 저장하므로 반복적인 데이터 처리의 필요성이 줄어듭니다.

CREATE VIEW dbo.Sample_View AS
SELECT LOAD_DATE, IS_CURRENT
FROM dbo.sample
WHERE LOAD_DATE < '2025-01-01';
GO
CREATE UNIQUE CLUSTERED INDEX idx_sample_view ON dbo.Sample_View (LOAD_DATE);
GO
UPDATE dbo.sample
SET IS_CURRENT = 0
FROM dbo.Sample_View v
WHERE dbo.sample.LOAD_DATE = v.LOAD_DATE;
GO

해결 방법 5: 예약 업데이트를 위한 SQL Server 에이전트 작업 접근 방식

일정에 따라 테이블을 업데이트해야 하는 경우 SQL Server 에이전트를 사용하면 수동으로 실행할 필요 없이 특정 간격으로 업데이트 프로세스를 실행하는 작업을 만들 수 있습니다.

EXEC msdb.dbo.sp_add_job @job_name = 'Update IS_CURRENT Job';
EXEC msdb.dbo.sp_add_jobstep @job_name = 'Update IS_CURRENT Job',
@step_name = 'Update IS_CURRENT Step',
@subsystem = 'TSQL',
@command = 'UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE < ''2025-01-01'';',
@retry_attempts = 5, @retry_interval = 5;
EXEC msdb.dbo.sp_add_schedule @schedule_name = 'Daily Schedule',
@enabled = 1, @freq_type = 4, @freq_interval = 1, @active_start_time = 010000;
EXEC msdb.dbo.sp_attach_schedule @job_name = 'Update IS_CURRENT Job', @schedule_name = 'Daily Schedule';
EXEC msdb.dbo.sp_start_job @job_name = 'Update IS_CURRENT Job';

스크립트에 사용된 특정 SQL 명령에 대한 설명

대규모 테이블에 대한 SQL Server 스크립트 최적화

SQL Server에서 대규모 테이블을 작업할 때 테이블 구조를 변경하고 기존 행을 업데이트할 때 성능 최적화 기술을 고려하는 것이 중요합니다. 대규모 테이블에서 스크립트를 실행할 때 직면하는 가장 일반적인 문제 중 하나는 특히 테이블에 백만 개 이상의 행이 포함된 경우 이러한 작업을 완료하는 데 걸리는 시간입니다. 문제의 작업(예: 테이블 변경 특정 날짜 조건에 따라 명령을 실행하고 행을 업데이트하는 데는 상당한 시간이 걸릴 수 있습니다. 성능이 최우선인 프로덕션 데이터베이스에서 작업할 때 이러한 작업을 최적화하는 것이 더욱 중요해집니다. 단일 스크립트는 잠재적으로 장기간 테이블을 잠가서 다른 쿼리와 사용자에게 영향을 미칠 수 있습니다.

성능 문제를 완화하기 위한 가장 좋은 접근 방식 중 하나는 작업을 더 작은 단계로 나누는 것입니다. 예를 들어 단일 스크립트에서 열을 추가하고 모든 행을 업데이트하는 대신 테이블 변경 별도로 명령을 내린 후 일괄 처리합니다. UPDATE 운영. 더 작은 청크로 레코드를 업데이트하면 스크립트가 서버를 압도하지 않습니다. 다음을 활용할 수 있습니다. UPDATE TOP 각 트랜잭션에 영향을 받는 행 수를 제한하는 명령입니다. 또한, 작업에 사용된 열에 인덱스를 생성하는 것도 좋은 생각입니다. WHERE 조항(예: LOAD_DATE) 검색 프로세스 속도를 높입니다. 대규모 데이터 세트의 경우 인덱스는 날짜 범위를 기준으로 행을 필터링하는 데 걸리는 시간을 줄여줍니다.

또 다른 중요한 고려 사항은 트랜잭션 및 오류 처리를 사용하여 작업이 원자적으로 실행되도록 하는 것입니다. 포장하여 UPDATE 내부의 진술 BEGIN TRANSACTION 그리고 COMMIT, 안전하고 일관된 방식으로 변경이 이루어졌는지 확인합니다. 프로세스의 일부가 실패하면 다음을 사용할 수 있습니다. ROLLBACK 변경 사항을 되돌리고 부분 업데이트를 방지합니다. 또한 사용량이 적은 시간에 스크립트를 실행하거나 SQL Server 에이전트를 사용하여 이러한 작업을 예약하면 시스템 성능에 미치는 영향을 최소화할 수 있습니다. 이러한 최적화를 통해 시스템 무결성을 유지하면서 대규모 테이블에서 복잡한 수정을 안전하게 실행할 수 있습니다. 🖥️

SQL Server 테이블 수정에 대해 자주 묻는 질문

  1. SQL Server의 테이블에 새 열을 어떻게 추가하나요?
  2. 다음을 사용하여 새 열을 추가할 수 있습니다. ALTER TABLE 명령. 예: ALTER TABLE dbo.sample ADD IS_CURRENT BIT; 데이터 유형이 BIT인 IS_CURRENT라는 열을 추가합니다.
  3. SQL Server에서 특정 행 범위만 업데이트하려면 어떻게 해야 하나요?
  4. 사용 UPDATE 명령을 사용하여 WHERE 행을 필터링하는 절입니다. 예: UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
  5. 내 스크립트에서 "잘못된 열 이름" 오류가 발생하는 이유는 무엇입니까?
  6. 이 오류는 다음과 같은 경우에 발생합니다. ALTER TABLE 명령이 실행되기 전에 완전히 커밋되지 않았습니다. UPDATE 성명. 이를 방지하려면 다음을 실행하세요. ALTER TABLE 먼저 명령을 실행하고 열이 추가될 때까지 기다린 후 다음을 실행합니다. UPDATE 별도로 문의하세요.
  7. 성능을 향상시키기 위해 행을 일괄 업데이트하려면 어떻게 해야 합니까?
  8. 사용 UPDATE TOP 한 번에 업데이트되는 행 수를 제한하는 명령입니다. 예: UPDATE TOP (1000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
  9. 원자성 업데이트를 보장하기 위해 트랜잭션을 사용할 수 있나요?
  10. 예! 당신의 포장 UPDATE 의 진술 BEGIN TRANSACTION 그리고 COMMIT 모든 업데이트가 단일 단위로 적용되도록 차단합니다. 오류가 발생하면 다음을 사용하십시오. ROLLBACK 변경 사항을 취소하려면
  11. SQL Server에서 대규모 업데이트의 성능을 최적화하는 가장 좋은 방법은 무엇입니까?
  12. 업데이트를 더 작은 단위로 나누고, 관련 열에 인덱스를 만들고, 사용량이 적은 시간에 스크립트를 실행하는 것을 고려해 보세요. 추가적으로, UPDATE TOP 방법은 잠금 문제를 방지하고 리소스 소비를 줄이는 데 도움이 됩니다.
  13. SQL Server에서 날짜 비교를 보다 동적으로 만들려면 어떻게 해야 합니까?
  14. 다음과 같은 날짜 기능을 사용하십시오. DATEADD 그리고 DATEDIFF 동적 날짜 계산을 수행합니다. 예를 들어 날짜를 60일 전으로 설정하려면 DATEADD(DAY, -60, GETDATE())를 사용합니다.
  15. 날짜를 기준으로 수백만 개의 행을 업데이트해야 하는 경우 어떻게 해야 합니까?
  16. 성능 향상을 위해 인덱싱된 열을 사용하는 것이 좋습니다. 또한 업데이트를 더 작은 트랜잭션으로 분할하고 UPDATE TOP 행을 일괄 업데이트합니다.
  17. 대규모 테이블을 업데이트할 때 잠금 문제를 방지하려면 어떻게 해야 합니까?
  18. 잠금 문제를 방지하려면 업데이트를 더 작은 배치로 나누고, 트랜잭션을 사용하여 변경 사항을 단계적으로 커밋하고, 사용량이 적은 시간에 업데이트를 실행하는 것을 고려하세요.
  19. SQL Server에서 대규모 업데이트 스크립트를 예약할 수 있나요?
  20. 예, SQL Server 에이전트를 사용하면 사용량이 적은 시간에 대규모 업데이트 스크립트를 예약하여 시스템 성능에 미치는 영향을 최소화할 수 있습니다. SQL Server 에이전트에서 작업을 생성하고 원하는 일정을 설정합니다.

SQL Server에서 대규모 테이블 수정 최적화

SQL Server를 사용하여 대규모 테이블을 수정할 때 작업을 세분화하는 것이 성능 향상의 핵심입니다. 수백만 개의 행이 있는 테이블에 열을 추가하고 특정 조건에 따라 데이터를 업데이트하는 것은 어려울 수 있습니다. 이를 위해서는 다음과 같은 명령의 전략적 실행이 필요합니다. 테이블 변경 그리고 UPDATE 시스템에 부담을 주지 않고 변경 사항이 적용되도록 합니다.

또한 업데이트 일괄 처리, 인덱싱 사용, 사용량이 적은 시간 동안 스크립트 실행과 같은 모범 사례를 구현하면 테이블 잠금 및 성능 저하와 같은 문제를 방지하는 데 도움이 될 수 있습니다. 워크로드를 분할하고 쿼리를 최적화하면 다운타임이나 "잘못된 열 이름"과 같은 오류가 발생하지 않고 안전하게 대규모 변경을 수행할 수 있습니다. 💻

참고자료 및 출처
  1. SQL Server에서 테이블을 변경하고 데이터를 업데이트하는 프로세스를 자세히 설명합니다. 테이블 변경 및 모범 사례에 대한 자세한 내용은 다음을 참조하세요. Microsoft SQL Server 설명서 .
  2. 대규모 테이블 작업 및 SQL 명령 최적화에 대한 통찰력을 제공합니다. SQL 판잣집 .
  3. 날짜 기반 조건부 업데이트 및 SQL 인덱싱의 중요성을 설명합니다. SQL 서버 센트럴 .