다음을 통해 공유


.update table 명령

적용 대상: ✅Microsoft Fabric✅Azure Data Explorer

.update table 명령은 레코드를 원자 단위로 삭제하고 추가하여 지정된 테이블에서 데이터 업데이트를 수행합니다.

Warning

이 명령은 복구할 수 없습니다.

참고 항목

업데이트 정책.update table.update table 원본인 테이블에서 명령을 실행하면 이 명령은 수정되는 테이블이 업데이트 정책 원본인 이러한 업데이트 정책을 트리거합니다.

단일 명령으로 최대 5백만 개의 레코드를 삭제할 수 있습니다.

사용 권한

이 명령을 실행하려면 테이블 관리자 이상의 권한이 있어야 합니다.

Syntax

참고 항목

미리 보기 중에 사용할 수 있었던 간소화된 구문은 더 이상 사용되지 않습니다.

구문 규칙에 대해 자세히 알아봅니다.

.update[async] table TableName DeleteIdentifier append AppendIdentifier [with ( propertyName = propertyValue ] ) delete <|
letDeleteIdentifier= DeletePredicate;
letAppendIdentifier= AppendPredicate;

매개 변수

이름 Type 필수 설명
async string 지정한 경우 명령이 비동기 모드에서 실행됨을 나타냅니다.
TableName string ✔️ 업데이트할 테이블의 이름입니다.
DeleteIdentifier string ✔️ 업데이트된 테이블에 적용된 삭제 조건자를 지정하는 데 사용되는 식별자 이름입니다.
DeletePredicate string ✔️ 결과를 삭제할 데이터로 사용하는 쿼리의 텍스트입니다. 조건자는 일시 삭제 조건자와 동일한 제한 사항이 있습니다.
AppendIdentifier string ✔️ 업데이트된 테이블에 적용되는 추가 조건자를 지정하는 데 사용되는 식별자 이름입니다.
AppendPredicate string ✔️ 결과를 추가할 데이터로 사용되는 쿼리의 텍스트입니다.

Important

  • 삭제 및 추가 조건자는 모두 원격 엔터티, db 간 및 클러스터 간 엔터티를 사용할 수 없습니다. 조건자는 외부 테이블을 참조하거나 연산자를 externaldata 사용할 수 없습니다.
  • 추가 및 삭제 쿼리는 결정적 결과를 생성해야 합니다. 비결정적 쿼리는 예기치 않은 결과를 초래할 수 있습니다. 쿼리는 여러 번 실행되는 경우 동일한 데이터를 반환하는 경우에만 결정적입니다.
    • 예를 들어 이러한 연산자는 결정적이지 않으므로 연산자, sample 연산자,rand 함수 및 기타 연산자를 사용하지 take 않는 것이 좋습니다.
  • 쿼리는 실행 내에서 update 두 번 이상 실행될 수 있습니다. 중간 쿼리 결과가 일치하지 않으면 업데이트 명령에서 예기치 않은 결과를 생성할 수 있습니다.

지원되는 속성

속성 형식 설명
whatif bool 이면 true레코드를 추가/삭제하지 않고 모든 분할된 데이터베이스에 추가/삭제할 레코드 수를 반환합니다. 기본값은 false입니다.
분산 bool 이 경우 true명령은 쿼리를 실행하는 모든 노드에서 병렬로 수집됩니다. 기본값은 false입니다. 성능 팁을 참조하세요.

Important

데이터를 삭제하거나 추가하기 전에 먼저 모드에서 whatif 실행하여 조건자의 유효성을 검사하도록 업데이트를 실행하는 것이 좋습니다.

반품

명령의 결과는 각 레코드가 새 데이터로 생성되었거나 레코드가 삭제된 범위를 나타내는 테이블입니다.

속성 형식 설명
테이블 string 익스텐트 생성 또는 삭제된 테이블입니다.
작업 string 익스텐트에서 수행된 작업에 따라 만들 거나 삭제 합니다.
ExtentId guid 명령에 의해 생성되거나 삭제된 익스텐트 고유 식별자입니다.
RowCount long 명령에 의해 지정된 익스텐트에서 만들거나 삭제한 행의 수입니다.

뷰와 구체화된 뷰 중에서 .update table 선택

명령 또는 구체화된 뷰.update table 사용하여 테이블에서 동일한 목표를 달성할 수 있는 시나리오가 있습니다. 예를 들어 구체화된 뷰를 사용하여 각 레코드의 최신 버전을 유지하거나 새 버전을 사용할 수 있는 경우 업데이트를 사용하여 레코드를 업데이트할 수 있습니다.

다음 지침을 사용하여 사용할 방법을 결정합니다.

  • 구체화된 뷰에서 업데이트 패턴이 지원되지 않는 경우 업데이트 명령을 사용합니다.
  • 원본 테이블에 수집 볼륨이 많지만 업데이트가 거의 없는 경우 업데이트 명령을 사용하면 구체화된 뷰보다 성능이 더 높고 캐시 또는 스토리지를 적게 사용할 수 있습니다. 구체화된 뷰는 수집된 모든 데이터를 다시 처리해야 하기 때문입니다. 이는 추가 또는 삭제 조건자를 기반으로 업데이트할 개별 레코드를 식별하는 것보다 효율성이 떨어집니다.
  • 구체화된 뷰는 완전히 관리되는 솔루션입니다. 구체화된 뷰는 한 번 정의되고 시스템에 의해 백그라운드에서 구체화가 수행됩니다. 업데이트 명령에는 업데이트가 있을 때마다 업데이트 명령을 명시적으로 실행하는 오케스트레이션된 프로세스(예: Azure Data Factory, Logic Apps, Power Automate 등)가 필요합니다. 구체화된 뷰가 사용 사례에 충분히 적합한 경우 구체화된 뷰를 사용하려면 관리 및 유지 관리가 덜 필요합니다.

성능 팁

  • 데이터 수집은 쿼리 실행을 포함하여 클러스터의 동시 작업에 영향을 줄 수 있는 리소스 집약적인 작업입니다. 많은 명령을 한 번에 실행하고 .update 분산 속성을 집중적으로 사용하는 리소스 집약적 작업을 사용하지 않는 것이 좋습니다.
  • 추가 데이터를 작업당 1GB 미만으로 제한합니다. 필요한 경우 여러 업데이트 명령을 사용합니다.
  • 쿼리에서 distributed 생성되는 데이터의 양이 크고 1GB를 초과하며 serialization이 필요하지 않은 경우에만 플래그 true 를 설정합니다. 그러면 여러 노드가 병렬로 출력을 생성할 수 있습니다. 쿼리 결과가 작을 때는 이 플래그를 사용하지 마세요. 이 플래그는 불필요하게 많은 작은 데이터 분할된 데이터베이스를 생성할 수 있기 때문에 사용하지 마세요.

예제

예제에서는 다음 표를 사용합니다.

.set-or-replace Employees <|
  range i from 1 to 100 step 1
  | project Id=i
  | extend Code = tostring(dynamic(["Customer", "Employee"])[Id %2])
  | extend Color = tostring(dynamic(["Red", "Blue", "Gray"])[Id %3])

이 명령은 다음으로 시작하는 레코드가 100인 테이블을 만듭니다.

ID 코드 Color
1 직원 파랑
2 고객 회색
3 직원 빨간색
4 고객 파랑
5 직원 회색
6 고객 빨간색
6 직원 파랑

한 행에서 단일 열 업데이트

다음 예제에서는 단일 행에서 단일 열을 업데이트합니다.

.update table Employees delete D append A with(whatif=true) <|
    let D = Employees
      | where Id==3;
    let A = Employees
      | where Id==3
      | extend Color="Orange";

true whatif 로 설정됩니다. 이 쿼리 후에는 테이블이 변경되지 않지만 명령은 한 행이 삭제된 범위와 한 행이 있는 새 익스텐트를 반환합니다.

다음 명령은 실제로 업데이트를 수행합니다.

.update table Employees delete D append A <|
    let D = Employees
      | where Id==3;
    let A = Employees
      | where Id==3
      | extend Color="Orange";

여러 행에서 단일 열 업데이트

다음 예제에서는 값이 파란색인 행의 한 열 Color 에서 녹색으로 업데이트합니다.

.update table Employees delete D append A <|
    let D = Employees
        | where Code=="Employee"
        | where Color=="Blue";
    let A = D
      | extend Color="Green";

여기서는 추가 조건자의 정의에서 삭제 식별자를 다시 사용했습니다.

여러 행에서 여러 열 업데이트

다음 예제에서는 모든 행에서 여러 열을 회색으로 업데이트합니다.

.update table Employees delete D append A <|
    let D = Employees
      | where Color=="Gray";
    let A = D
      | extend Code=strcat("ex-", Code)
      | extend Color="";

다른 테이블(참조 값)을 사용하여 행 업데이트

이 예제에서 첫 번째 단계는 다음 매핑 테이블을 만드는 것입니다.

.set-or-replace ColorMapping <|
  datatable(OldColor:string, NewColor:string)[
    "Red", "Pink",
    "Blue", "Purple",
    "Gray", "LightGray",
    "Orange", "Yellow",
    "Green", "AppleGreen"
  ]

이 매핑 테이블은 원래 테이블의 일부 색을 업데이트하는 데 사용됩니다.

.update table Employees delete D append A <|
  let D = Employees
    | where Code=="Customer";
  let A = D
    | lookup ColorMapping on $left.Color==$right.OldColor
    | project Id, Code, Color=NewColor

datatable을 사용하여 행 업데이트

경우에 따라 업데이트할 값이 테이블에 저장되지 않고 알려지고 데이터 테이블 연산자가 유용할 수 있습니다.

.update table Employees delete D append A <|
  let A = datatable(Id:long, Code:string, Color:string)[
    1, "Customer", "Purple",
    2, "Customer", "Magenta",
    3, "Customer", "Turquoise",
  ];
  let D = Employees
      | join kind=leftsemi A on Id
      | where true;

준비 테이블을 사용하여 행 업데이트

인기 있는 패턴은 주 테이블을 업데이트하기 전에 먼저 준비 테이블에 데이터를 배치하는 것입니다.

첫 번째 명령은 준비 테이블을 만듭니다.

.set-or-replace MyStagingTable <|
    range i from 70 to 130 step 5
    | project Id=i
    | extend Code = tostring(dynamic(["Customer", "Employee"])[Id %2])
    | extend Color = tostring(dynamic(["Red", "Blue", "Gray"])[Id %3])

다음 명령은 기본 테이블을 준비 테이블의 데이터로 업데이트합니다.

.update table Employees delete D append A <|
    let A = MyStagingTable;
    let D = Employees
        | join kind=leftsemi MyStagingTable on Id
        | where true;

준비 테이블의 일부 레코드는 주 테이블(즉, 포함 Id>100)에 없지만 주 테이블에 여전히 삽입되었습니다(upsert 동작).

복합 키

첫 번째 명령은 복합 키가 있는 테이블을 만듭니다.

.set-or-replace VersionedArticle <|
  datatable(ArticleId:string, Version:int, Detail:string)[
    "A", 1, "Early version",
    "B", 1, "News about mobiles",
    "C", 1, "Opinion article",
    "B", 2, "Revision about brand X",
    "B", 3, "Revision about brand Y",
    "C", 2, "Fact check"
  ]

다음 명령은 확장된 구문을 사용하여 특정 레코드를 업데이트합니다.

.update table VersionedArticle delete D append A <|
  let D = VersionedArticle
    | where ArticleId=="B"
    | where Version==3;
  let A = VersionedArticle
    | where ArticleId=="B"
    | where Version==3
    | extend Detail = "Revision about brand Z";