다음을 통해 공유


탄력적 데이터베이스 도구를 사용하여 다중 분할된 데이터베이스 쿼리

적용 대상:Azure SQL Database

개요

Azure SQL Database를 사용하여 스케일 아웃을 사용하면 분할된 데이터베이스 솔루션을 만들 수 있습니다. 다중 분할된 데이터베이스 쿼리 는 여러 분할된 데이터베이스 간에 걸친 쿼리를 실행해야 하는 데이터 컬렉션/보고와 같은 작업에 사용됩니다. (이 쿼리는 단일 분할된 데이터베이스에서 모든 작업을 수행하는 데이터 종속 라우팅과 대조됩니다.)

  1. RangeShardMap (Java, .NET) 또는 ListShardMap (Java, .NET)을 TryGetRangeShardMap (Java, .NET), TryGetListShardMap (Java, .NET), 또는 GetShardMap (Java, .NET) 메서드를 사용하여 가져옵니다. ShardMapManager 생성RangeShardMap 또는 ListShardMap 가져오기를 참조하세요.
  2. MultiShardConnection (Java, .NET) 개체를 만듭니다.
  3. MultiShardStatement 또는 MultiShardCommand (Java, .NET)을 생성합니다.
  4. CommandText property (Java, .NET)를 T-SQL 명령으로 설정합니다.
  5. 명령을 실행하려면 ExecuteQueryAsync 또는 ExecuteReader (Java, .NET) 메서드를 호출하십시오.
  6. MultiShardResultSet 또는 MultiShardDataReader (Java, .NET) 클래스를 사용하여 결과를 봅니다.

예시

다음 코드에서는 지정된 ShardMapmyShardMap사용하여 다중 분할된 데이터베이스 쿼리를 사용하는 방법을 보여 줍니다.

using (MultiShardConnection conn = new MultiShardConnection(myShardMap.GetShards(), myShardConnectionString))
{
    using (MultiShardCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "SELECT c1, c2, c3 FROM ShardedTable";
        cmd.CommandType = CommandType.Text;
        cmd.ExecutionOptions = MultiShardExecutionOptions.IncludeShardNameColumn;
        cmd.ExecutionPolicy = MultiShardExecutionPolicy.PartialResults;

        using (MultiShardDataReader sdr = cmd.ExecuteReader())
        {
            while (sdr.Read())
            {
                var c1Field = sdr.GetString(0);
                var c2Field = sdr.GetFieldValue<int>(1);
                var c3Field = sdr.GetFieldValue<Int64>(2);
            }
        }
    }
}

주요 차이점은 다중 분할된 데이터베이스 연결의 생성입니다. 개별 데이터베이스 SqlConnection 에서 작동하는 경우 MultiShardConnection 분할된 데이터베이스의 컬렉션을 입력으로 사용합니다. 분할된 데이터베이스 맵에서 분할된 데이터베이스 컬렉션을 채웁니다. 그런 다음 UNION ALL 의미 체계를 사용하여 데이터 분할 컬렉션에서 쿼리를 실행하고 이를 통해 단일 전체 결과를 조립합니다. 필요에 따라 명령어의 ExecutionOptions 속성을 사용하여 행이 시작되는 샤드의 이름을 출력에 추가할 수 있습니다.

myShardMap.GetShards()에 대한 호출을 파악합니다. 이 메서드는 분할된 데이터베이스 맵에서 모든 분할된 데이터베이스를 검색하고 모든 관련 데이터베이스에서 쿼리를 실행하는 쉬운 방법을 제공합니다. 다중 샤드 쿼리에 대한 조각 컬렉션은 myShardMap.GetShards() 호출에서 반환된 컬렉션에 대해 LINQ 쿼리를 수행함으로써 더욱 세밀하게 조정될 수 있습니다. 부분 결과 정책과 함께 다중 분할된 데이터베이스 쿼리의 현재 기능은 수십 최대 수백 개의 분할된 데이터베이스에서 제대로 작동하도록 설계되었습니다.

다중 분할된 데이터베이스 쿼리의 제한 사항은 현재 쿼리가 실행되는 shardlet 및 분할된 데이터베이스에 대한 유효성 검사가 없다는 것입니다. 데이터 종속 라우팅이 쿼리 시 지정된 분할된 데이터베이스가 분할된 데이터베이스 맵의 일부인지 확인하며, 다중 분할된 데이터베이스 쿼리가 이 검사를 수행하지는 않습니다. 이로 인해 분할된 데이터베이스 맵에서 제거된 데이터베이스에서 다중 분할된 데이터베이스 쿼리가 실행될 수 있습니다.

다중 분할된 데이터베이스 쿼리 및 분할-병합 작업

다중 분할된 데이터베이스 쿼리는 쿼리된 데이터베이스의 shardlet이 진행 중인 분할 병합 작업에 참여하고 있는지 여부를 확인하지 않습니다. ( 스케일 아웃된 클라우드 데이터베이스 간에 데이터 이동 참조) 이로 인해 동일한 shardlet의 행이 동일한 다중 분할된 데이터베이스 쿼리의 여러 데이터베이스에 대해 표시되는 불일치가 발생할 수 있습니다. 이러한 제한 사항에 유의하고 다중 분할된 데이터베이스 쿼리를 수행하는 동안 진행 중인 분할-병합 작업 및 분할된 데이터베이스 맵의 변경 내용을 드레이닝하는 것이 좋습니다.

아직 탄력적인 데이터베이스 도구를 사용 하지 않나요? 시작 가이드를 확인합니다. 질문이 있는 경우 SQL Database에 대한 Microsoft Q&A 질문 페이지에서 문의하고, 기능 요청이 있는 경우 SQL Database 사용자 의견 포럼에서 새로운 아이디어를 추가하거나 기존 아이디어에 투표해 주세요.