다음을 통해 공유


빠른 시작: 쿼리 최적화 도우미(미리 보기)

GitHub Copilot는 개발자, 특히 심층적인 T-SQL 전문 지식이 없는 개발자에게 데이터베이스 내부 없이 쿼리를 최적화하고 성능 병목 상태를 분석하는 데 master 도움이 됩니다. 복잡한 SQL을 분석하고, 실행 계획을 해석하고, 인덱싱 전략 또는 리팩터링 기회를 제안하여 개발자가 기능 제공에 집중하면서 앱의 기능과 성능을 유지할 수 있습니다.

시작하기

데이터베이스에 연결되어 있고 MSSQL 확장으로 활성 편집기 창이 열려 있는지 확인합니다. 이 연결을 사용하면 채팅 참가자가 @mssql 데이터베이스 환경의 컨텍스트를 이해할 수 있으므로 정확하고 컨텍스트 인식 제안을 사용할 수 있습니다. 데이터베이스 연결이 없으면 채팅 참가자는 의미 있는 응답을 제공하는 스키마 또는 데이터 컨텍스트가 없습니다.

다음 예제에서는 AdventureWorksLT2022 홈페이지에서 다운로드할 수 있는 샘플 데이터베이스를 사용합니다.

최상의 결과를 위해 사용자 고유의 환경에 맞게 테이블 및 스키마 이름을 조정합니다.

@mssql 접두사가 채팅에 포함되어 있는지 확인하세요. 예를 들어, @mssql을 입력한 후에 질문이나 프롬프트를 작성합니다. 이렇게 하면 채팅 참가자가 SQL 관련 지원을 요청하는 것을 이해할 수 있습니다.

GitHub Copilot를 사용하여 성능 최적화

GitHub Copilot는 개발자가 쿼리 튜닝 또는 실행 계획 분석에 대한 심층적인 전문 지식 없이도 성능이 좋은 프로덕션 준비 데이터베이스 코드를 작성할 수 있는 여러 가지 방법을 제공합니다. 새 기능을 빌드하든 성능 문제를 조사하든 GitHub Copilot는 Visual Studio Code의 기존 워크플로 내에서 인사이트를 표시하고 최적화를 권장하며 쿼리를 재구성하는 데 도움을 줄 수 있습니다.

다음은 채팅 참가자를 통해 요청할 수 있는 일반적인 사용 사례 및 예제입니다.

쿼리 최적화

GitHub Copilot를 사용하여 SQL 또는 ORM 쿼리의 비효율성을 식별하고 성능을 향상시키는 방법을 제안합니다. 느린 쿼리를 다시 작성하는 것부터 인덱스를 추천하거나 Cartesian 조인과 같은 안티 패턴을 방지하는 것까지 GitHub Copilot는 현재 컨텍스트에 따라 T-SQL 및 ORM 모범 사례를 적용하는 데 도움이 됩니다.

  • 다음 쿼리를 최적화합니다.
SELECT *
FROM SalesLT.SalesOrderHeader
WHERE OrderDate > '2023-01-01';
  • 이 쿼리에 대한 인덱싱 개선 사항을 제안합니다.
SELECT ProductID
FROM SalesLT.SalesOrderDetail
WHERE Quantity > 100;
  • 카티시안 조인을 방지하려면 이 쿼리를 다시 작성합니다. 새 쿼리가 T-SQL 모범 사례를 따르는지 확인합니다.
SELECT * FROM Customers, Order;
  • 불필요한 중첩된 선택을 방지하고 가독성을 향상시키기 위해 이 Prisma 쿼리를 다시 작성합니다.
const orders = await prisma.salesOrderHeader.findMany({
  where: {
    orderDate: {
      gt: new Date('2023-01-01')
    }
  }
});

실행 계획 분석

실행 계획은 SQL 엔진이 쿼리를 처리하는 방법에 대한 자세한 분석을 제공합니다. GitHub Copilot를 사용하면 실행 계획을 해석하고, 중첩된 루프 조인과 같은 병목 상태를 식별하고, 실제 쿼리 패턴 및 인덱싱 전략에 따라 향상된 기능을 제안할 수 있습니다.

MSSQL 확장의 예상/실제 계획 옵션을 사용하여 실행 계획을 생성하는 예제로 다음 쿼리를 사용할 수 있습니다.

SELECT soh1.SalesOrderID AS OrderA,
       soh2.SalesOrderID AS OrderB,
       soh1.TotalDue AS TotalA,
       soh2.TotalDue AS TotalB
FROM SalesLT.SalesOrderHeader AS soh1
CROSS JOIN SalesLT.SalesOrderHeader AS soh2
WHERE soh1.TotalDue < soh2.TotalDue
ORDER BY soh2.TotalDue DESC;

팁 (조언)

가능한 한 많은 컨텍스트를 포함하기 위해, 편집기에서 쿼리를 선택하고 sqlplan 파일을 GitHub Copilot 채팅 창에 추가하세요.

Visual Studio Code의 실행 계획 예제를 보여 주는 스크린샷

  • 내 데이터베이스 전문가가 공유하는 실행 계획에 따르면 다음 쿼리는 내 앱의 성능에 영향을 주는 중첩된 루프 조인을 사용합니다. 왜 이런 일이 일어날 수 있는지 간단히 설명할 수 있습니까? 또한 쿼리의 성능을 향상시킬 수 있는 최적화 전략을 제안합니다.

MSSQL 확장의 예상/실제 계획 옵션을 사용하여 실행 계획을 생성하는 예제로 다음 쿼리를 사용할 수 있습니다.

SELECT c1.CustomerID,
       c1.LastName,
       c2.CustomerID AS MatchingCustomerID,
       c2.LastName AS MatchingLastName
FROM SalesLT.Customer AS c1
     INNER JOIN SalesLT.Customer AS c2
         ON c1.LastName = c2.LastName
        AND c1.CustomerID <> c2.CustomerID
OPTION (LOOP JOIN);

팁 (조언)

가능한 한 많은 컨텍스트를 포함하기 위해, 편집기에서 쿼리를 선택하고 sqlplan 파일을 GitHub Copilot 채팅 창에 추가하세요.

Visual Studio Code에서 중첩된 루프 조인이 있는 실행 계획을 보여 주는 스크린샷

  • TotalDue에서 필터를 사용하여 조인을 수행하는 이 쿼리의 실행 계획을 설명합니다.
SELECT c.CustomerID,
       c.FirstName,
       c.LastName,
       soh.SalesOrderID,
       soh.TotalDue
FROM SalesLT.Customer AS c
     INNER JOIN SalesLT.SalesOrderHeader AS soh
         ON c.CustomerID = soh.CustomerID
WHERE soh.TotalDue > 500;

쿼리 재구성

CTE(Common Table Expressions)를 사용하여 쿼리를 재구성하면 특히 복잡한 논리 또는 중첩된 하위 쿼리의 가독성 및 유지 관리 효율성이 향상될 수 있습니다. GitHub Copilot는 의도를 유지하고 명확성을 향상하는 동시에 CTE를 사용하도록 기존 쿼리를 다시 작성하는 데 도움이 될 수 있습니다.

  • 일반 테이블 식(CTEs)을 사용하여 이 쿼리를 다시 작성하여 명확성을 향상시킵니다.
SELECT *
FROM (SELECT ProductID,
             SUM(Quantity) AS TotalQuantity
      FROM Sales
      GROUP BY ProductID) AS SubQuery;
  • 가독성 및 유지 관리를 개선하기 위해 CTE(공통 테이블 식)를 사용하여 다음 쿼리를 다시 작성합니다.
SELECT soh.CustomerID,
       COUNT(*) AS OrderCount
FROM SalesLT.SalesOrderHeader AS soh
WHERE soh.OrderDate > '2022-01-01'
GROUP BY soh.CustomerID
HAVING COUNT(*) > 5;
  • CTE를 사용하여 이 쿼리의 필터 조건과 집계 논리를 구분합니다.
SELECT ProductID,
       AVG(UnitPrice) AS AvgPrice
FROM SalesLT.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(UnitPrice) > 50;

Code-First 성능 시나리오

Entity Framework, Prisma 또는 Sequelize와 같은 ORM으로 작업할 때 쿼리가 최적화되지 않으면 성능이 저하될 수 있습니다. GitHub Copilot는 코드 우선 워크플로에서 누락된 인덱스, 비효율적인 필터링 및 N+1 문제와 같은 문제를 감지하고 해결하는 데 도움이 됩니다.

  • Prisma 프로젝트에서 인덱스를 필터링하여 OrderDateSalesOrderHeader 쿼리가 효과적으로 사용되도록 하려면 어떻게 해야 할까요?
  • Entity Framework Core를 사용하여 총 주문 값으로 상위 10명의 고객을 검색하는 LINQ 쿼리를 분석하고 최적화하려면 어떻게 해야 할까요?
  • Sequelize에서 N+1 쿼리 문제를 최소화하기 위해 제품 세부 정보로 주문 기록을 가져오는 쿼리를 어떻게 재구성합니까?

피드백: 쿼리 최적화 프로그램 도우미

MSSQL 확장에 대한 GitHub Copilot를 구체화하고 개선하는 데 도움이 되도록 다음 GitHub 문제 템플릿을 사용하여 피드백을 제출합니다. GitHub Copilot 피드백

피드백을 제출할 때 다음을 포함하는 것이 좋습니다.

  • 테스트된 시나리오 – 스키마 만들기, 쿼리 생성, 보안, 지역화와 같이 집중한 영역을 알려주세요.
  • 잘 작동하는 기능 – 원활하거나 도움이 되거나 예상을 초과한 모든 경험을 설명합니다.
  • 문제 또는 버그 – 문제, 불일치 또는 혼란스러운 동작을 포함합니다. 스크린샷 또는 화면 녹화가 특히 유용합니다.
  • 개선 제안 - 유용성 향상, 적용 범위 확장 또는 GitHub Copilot의 응답 향상을 위한 아이디어를 공유합니다.