.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
<|
let
DeleteIdentifier=
DeletePredicate;
let
AppendIdentifier=
AppendPredicate;
매개 변수
이름 | Type | 필수 | 설명 |
---|---|---|---|
async | string |
지정한 경우 명령이 비동기 모드에서 실행됨을 나타냅니다. | |
TableName | string |
✔️ | 업데이트할 테이블의 이름입니다. |
DeleteIdentifier | string |
✔️ | 업데이트된 테이블에 적용된 삭제 조건자를 지정하는 데 사용되는 식별자 이름입니다. |
DeletePredicate | string |
✔️ | 결과를 삭제할 데이터로 사용하는 쿼리의 텍스트입니다. 조건자는 일시 삭제 조건자와 동일한 제한 사항이 있습니다. |
AppendIdentifier | string |
✔️ | 업데이트된 테이블에 적용되는 추가 조건자를 지정하는 데 사용되는 식별자 이름입니다. |
AppendPredicate | string |
✔️ | 결과를 추가할 데이터로 사용되는 쿼리의 텍스트입니다. |
Important
- 삭제 및 추가 조건자는 모두 원격 엔터티, db 간 및 클러스터 간 엔터티를 사용할 수 없습니다. 조건자는 외부 테이블을 참조하거나 연산자를
externaldata
사용할 수 없습니다. - 추가 및 삭제 쿼리는 결정적 결과를 생성해야 합니다. 비결정적 쿼리는 예기치 않은 결과를 초래할 수 있습니다. 쿼리는 여러 번 실행되는 경우 동일한 데이터를 반환하는 경우에만 결정적입니다.
- 쿼리는 실행 내에서
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";