GitHub Copilot를 사용하면 개발자가 데이터베이스 내부, 특히 T-SQL(심층 Transact-SQL) 전문 지식이 없는 개발자에 대한 전문 지식 없이도 쿼리를 최적화하고 성능 병목 상태를 분석할 수 있습니다. GitHub Copilot는 복잡한 SQL을 분석하고 실행 계획을 해석하며 인덱싱 전략 또는 리팩터링 기회를 제안할 수 있습니다. 개발자는 기능 제공에 집중하면서 앱의 기능과 성능을 유지할 수 있습니다.
시작하기
데이터베이스에 연결되어 있고 MSSQL 확장으로 활성 편집기 창이 열려 있는지 확인합니다. 이 연결을 사용하면 채팅 참가자가 @mssql 데이터베이스 환경의 컨텍스트를 이해할 수 있으므로 정확하고 컨텍스트 인식 제안을 사용할 수 있습니다. 데이터베이스 연결이 없으면 채팅 참가자는 의미 있는 응답을 제공하는 스키마 또는 데이터 컨텍스트가 없습니다.
다음 예제에서는 AdventureWorksLT2022 홈페이지에서 다운로드할 수 있는 샘플 데이터베이스를 사용합니다.
최상의 결과를 위해 사용자 고유의 환경에 맞게 테이블 및 스키마 이름을 조정합니다.
@mssql 접두사가 채팅에 포함되어 있는지 확인하세요. 예를 들어, @mssql을 입력한 후에 질문이나 프롬프트를 작성합니다. 이렇게 하면 채팅 참가자가 SQL 관련 지원을 요청하는 것을 이해할 수 있습니다.
GitHub Copilot를 사용하여 성능 최적화
GitHub Copilot는 개발자가 쿼리 튜닝 또는 실행 계획 분석에 대한 심층적인 전문 지식 없이도 성능이 좋은 프로덕션 준비 데이터베이스 코드를 작성할 수 있는 여러 가지 방법을 제공합니다. 새 기능을 빌드하든 성능 문제를 조사하든 GitHub Copilot는 Visual Studio Code의 기존 워크플로 내에서 인사이트를 표시하고 최적화를 권장하며 쿼리를 재구성하는 데 도움을 줄 수 있습니다.
다음은 채팅 참가자를 통해 요청할 수 있는 일반적인 사용 사례 및 예제입니다.
쿼리 최적화
GitHub Copilot를 사용하여 SQL 또는 ORM(개체 관계형 매핑) 쿼리의 비효율성을 식별하고 성능을 향상시키는 방법을 제안합니다. GitHub Copilot를 사용하면 느린 쿼리를 다시 작성하는 것부터 인덱스를 추천하거나 현재 컨텍스트에 따라 Cartesian 조인과 같은 안티패턴을 방지하는 것까지 T-SQL 및 ORM 모범 사례를 적용할 수 있습니다.
기본 예제
Optimize the following query:
SELECT *
FROM SalesLT.SalesOrderHeader
WHERE OrderDate > '2023-01-01';
인덱스 개선 예제
Suggest indexing improvements for this query:
SELECT ProductID
FROM SalesLT.SalesOrderDetail
WHERE Quantity > 100;
조인 개선 예제
Rewrite this query to avoid a Cartesian join. Make sure the new query follows T-SQL best practices:
SELECT * FROM Customers, Order;
중첩된 선택 예제
Rewrite this Prisma query to avoid unnecessary nested selects and improve readability:
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;
편집기에서 쿼리를 선택하고 이 스크린샷처럼 GitHub Copilot 채팅 창에 sqlplan 파일을 포함하여 최대한 많은 컨텍스트를 포함시킵니다.
According to the execution plan shared by my database expert, the following query is using a nested loop join which is affecting the performance of my app. Can you explain in simple terms why this might be happening? Additionally, suggest optimization strategies that could improve the query's performance.
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 채팅 창에 포함하여 가능한 한 많은 컨텍스트를 제공하세요.
Explain the execution plan for this query that performs a join with a filter on 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)을 사용하여 쿼리를 재구성하면 특히 복잡한 논리 또는 중첩된 하위 쿼리의 가독성 및 유지 관리 효율성이 향상될 수 있습니다. GitHub Copilot는 의도를 유지하고 명확성을 향상하는 동시에 CTE를 사용하도록 기존 쿼리를 다시 작성하는 데 도움이 될 수 있습니다.
CTE에 대한 내부 선택 예제
Rewrite this query using common table expressions (CTEs) to improve clarity:
SELECT *
FROM (SELECT ProductID,
SUM(Quantity) AS TotalQuantity
FROM Sales
GROUP BY ProductID) AS SubQuery;
CTE에 대한 HAVING 절 예제
Rewrite the following query using a CTE (common table expression) to improve readability and maintainability:
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에 대한 집계 절의 예제
Use a CTE to separate the aggregation logic from the filter condition in this query:
SELECT ProductID,
AVG(UnitPrice) AS AvgPrice
FROM SalesLT.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(UnitPrice) > 50;
코드 우선 성능 시나리오
Entity Framework, Prisma 또는 Sequelize와 같은 ORM을 사용하는 경우 쿼리가 최적화되지 않으면 성능이 저하될 수 있습니다. GitHub Copilot는 코드 우선 워크플로에서 누락된 인덱스, 비효율적인 필터링 및 N+1 문제와 같은 문제를 감지하고 해결하는 데 도움이 됩니다.
Prisma 예제
In a Prisma project, how would you ensure that queries filtering by `OrderDate` in `SalesOrderHeader` are using indexes effectively?
Entity Framework Core 예제
Using Entity Framework Core, how can you analyze and optimize a LINQ query that retrieves the top 10 customers by total order value?
속편 예제
In Sequelize, how do you restructure a query that fetches order history with product details to minimize N+1 query issues?
사용자 경험 공유
MSSQL 확장에 대한 GitHub Copilot를 구체화하고 개선하는 데 도움이 되도록 다음 GitHub 문제 템플릿을 사용하여 피드백을 제출합니다. GitHub Copilot 피드백
피드백을 제출할 때 다음을 포함하는 것이 좋습니다.
테스트된 시나리오 – 스키마 만들기, 쿼리 생성, 보안, 지역화와 같이 집중한 영역을 알려주세요.
잘 작동하는 기능 – 원활하거나 도움이 되거나 예상을 초과한 모든 경험을 설명합니다.
문제 또는 버그 – 문제, 불일치 또는 혼란스러운 동작을 포함합니다. 스크린샷 또는 화면 녹화는 특히 유용합니다.
개선 제안 - 유용성 향상, 적용 범위 확장 또는 GitHub Copilot의 응답 향상을 위한 아이디어를 공유합니다.