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

적용 대상:Azure SQL Database

개요

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

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

예시

다음 코드에서는 myShardMap라고 하는 주어진 ShardMap을 사용하여 다중 분할된 데이터베이스 쿼리를 사용하는 방법을 보여 줍니다.

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이 진행 중인 분할 병합 작업에 참여하고 있는지 여부를 확인하지 않습니다. (Elastic Database 분할-병합 도구를 사용하여 확장하기 참조). 따라서 동일한 shardlet의 행이 동일한 다중 분할된 데이터베이스 쿼리의 여러 데이터베이스에 대해 표시하는 경우 불일치가 발생할 수 있습니다. 이러한 제한 사항에 유의하고 다중 분할된 데이터베이스 쿼리를 수행하는 동안 진행 중인 분할-병합 작업 및 분할된 데이터베이스 맵의 변경 내용을 드레이닝하는 것이 좋습니다.

추가 리소스

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