Udostępnij za pośrednictwem


Szybki start: Asystent optymalizatora zapytań (wersja zapoznawcza)

GitHub Copilot pomaga deweloperom, zwłaszcza tym, którzy nie mają głębokiej wiedzy dotyczącej języka T-SQL, optymalizowanie zapytań i analizowanie wąskich gardeł wydajności bez konieczności master używania wewnętrznych baz danych. Może on podzielić złożone zapytania SQL, interpretować plany wykonywania i sugerować strategie indeksowania lub możliwości refaktoryzacji, umożliwiając deweloperom utrzymanie aplikacji w dobrej kondycji i sprawnym działaniu, jednocześnie skupiając się na dostarczaniu nowych funkcji.

Rozpocznij

Upewnij się, że masz połączenie z bazą danych i masz otwarte aktywne okno edytora z rozszerzeniem MSSQL. To połączenie umożliwia uczestnikowi czatu @mssql zrozumienie kontekstu środowiska bazy danych, umożliwiając dokładne i kontekstowe sugestie. Bez połączenia z bazą danych uczestnik czatu nie będzie miał schematu ani kontekstu danych w celu zapewnienia znaczących odpowiedzi.

W poniższych przykładach użyto przykładowej bazy danych AdventureWorksLT2022, którą można pobrać ze strony głównej Przykładów i projektów społeczności programu Microsoft SQL Server.

Aby uzyskać najlepsze wyniki, dostosuj nazwy tabel i schematów, aby dopasować je do własnego środowiska.

Upewnij się, że czat zawiera @mssql prefiks. Na przykład wpisz @mssql swoje pytanie lub polecenie. Dzięki temu uczestnik czatu rozumie, że prosi o pomoc związaną z językiem SQL.

Optymalizowanie wydajności za pomocą narzędzia GitHub Copilot

GitHub Copilot oferuje wiele sposobów, aby ułatwić deweloperom pisanie wydajnego, gotowego do produkcji kodu bazy danych bez konieczności dogłębnej wiedzy w zakresie dostrajania zapytań lub analizy planu wykonywania. Niezależnie od tego, czy tworzysz nowe funkcje, czy badasz problem z wydajnością, narzędzie GitHub Copilot może uwidocznić szczegółowe informacje, polecać optymalizacje i pomagać w restrukturyzacji zapytań, a wszystko to w ramach istniejącego przepływu pracy w programie Visual Studio Code.

Poniżej przedstawiono typowe przypadki użycia i przykłady tego, co można zadać za pośrednictwem uczestnika czatu.

Optymalizowanie zapytań

Użyj narzędzia GitHub Copilot, aby zidentyfikować nieefektywne wyniki w zapytaniach SQL lub ORM i zasugerować sposoby poprawy wydajności. Od ponownego pisania wolnych zapytań do rekomendowania indeksów lub unikania antywzorców, takich jak łączenia kartezjańskie, GitHub Copilot pomaga stosować najlepsze praktyki T-SQL i ORM w oparciu o bieżący kontekst.

  • Zoptymalizuj następujące zapytanie:
SELECT *
FROM SalesLT.SalesOrderHeader
WHERE OrderDate > '2023-01-01';
  • Zasugeruj ulepszenia indeksowania dla tego zapytania:
SELECT ProductID
FROM SalesLT.SalesOrderDetail
WHERE Quantity > 100;
  • Zapisz ponownie to zapytanie, aby uniknąć sprzężenia kartezjańskiego. Upewnij się, że nowe zapytanie jest zgodne z najlepszymi rozwiązaniami języka T-SQL:
SELECT * FROM Customers, Order;
  • Zapisz ponownie to Prisma zapytanie, aby uniknąć niepotrzebnych zagnieżdżonych zapytań i zwiększyć czytelność.
const orders = await prisma.salesOrderHeader.findMany({
  where: {
    orderDate: {
      gt: new Date('2023-01-01')
    }
  }
});

Analiza planu wykonania

Plany wykonywania zawierają szczegółowy podział sposobu przetwarzania zapytań przez aparat SQL. Narzędzie GitHub Copilot może pomóc w interpretowaniu planów wykonywania, identyfikowaniu wąskich gardeł, takich jak sprzężenia zagnieżdżonych pętli, oraz sugerowaniu ulepszeń na podstawie rzeczywistych wzorców zapytań i strategii indeksowania.

Możesz użyć następującego zapytania jako przykładu, aby wygenerować plan wykonania przy użyciu opcji Szacowany/Rzeczywisty plan w rozszerzeniu 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;

Wskazówka

Pamiętaj, aby uwzględnić jak najwięcej kontekstu, wybierając zapytanie z edytora i uwzględniając sqlplan plik w oknie czatu w usłudze GitHub Copilot:

Zrzut ekranu przedstawiający przykład planu wykonania w programie Visual Studio Code.

  • Zgodnie z planem wykonywania udostępnionym przez mojego eksperta w zakresie bazy danych następujące zapytanie używa sprzężenia zagnieżdżonej pętli, które wpływa na wydajność mojej aplikacji. Czy możesz wyjaśnić w prosty sposób, dlaczego może się to wydarzyć? Ponadto sugeruje strategie optymalizacji, które mogą poprawić wydajność zapytania.

Możesz użyć następującego zapytania jako przykładu, aby wygenerować plan wykonania przy użyciu opcji Szacowany/Rzeczywisty plan w rozszerzeniu 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);

Wskazówka

Pamiętaj, aby uwzględnić jak najwięcej kontekstu, wybierając zapytanie z edytora i uwzględniając sqlplan plik w oknie czatu w usłudze GitHub Copilot:

Zrzut ekranu przedstawiający plan wykonania z zagnieżdżonym sprzężeniem pętli w programie Visual Studio Code.

  • Wyjaśnij plan wykonywania dla tego zapytania, które wykonuje sprzężenie z filtrem na 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;

Restrukturyzacja zapytań

Restrukturyzacja zapytań przy użyciu wspólnych wyrażeń tabel (CTE) może zwiększyć czytelność i łatwość utrzymania, szczególnie w przypadku złożonej logiki lub zagnieżdżonych podzapytaniach. GitHub Copilot może pomóc w ponownym zapisaniu istniejących zapytań, aby używać CTEs, zachowując ich intencję i poprawiając przejrzystość.

  • Ponownie zapisz to zapytanie przy użyciu typowych wyrażeń tabeli (CTEs), aby zwiększyć przejrzystość:
SELECT *
FROM (SELECT ProductID,
             SUM(Quantity) AS TotalQuantity
      FROM Sales
      GROUP BY ProductID) AS SubQuery;
  • Ponownie zapisz następujące zapytanie przy użyciu języka CTE (wspólnego wyrażenia tabeli), aby zwiększyć czytelność i łatwość konserwacji:
SELECT soh.CustomerID,
       COUNT(*) AS OrderCount
FROM SalesLT.SalesOrderHeader AS soh
WHERE soh.OrderDate > '2022-01-01'
GROUP BY soh.CustomerID
HAVING COUNT(*) > 5;
  • Użyj CTE, aby oddzielić logikę agregacji od warunku filtru w tym zapytaniu:
SELECT ProductID,
       AVG(UnitPrice) AS AvgPrice
FROM SalesLT.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(UnitPrice) > 50;

scenariusze wydajności Code-First

Podczas pracy z ORM-ami, takimi jak Entity Framework, Prisma lub Sequelize, wydajność może się pogorszyć, jeśli zapytania nie są zoptymalizowane. GitHub Copilot pomaga wykrywać i rozwiązywać problemy, takie jak brakujące indeksy, nieefektywne filtrowanie i problemy N+1 w przepływach pracy z kodem.

  • Jak w projekcie Prisma zapewnić, że zapytania filtrujące według OrderDate w SalesOrderHeader skutecznie wykorzystują indeksy?
  • Jak analizować i optymalizować zapytanie LINQ, które pobiera 10 pierwszych klientów według łącznej wartości zamówienia, za pomocą platformy Entity Framework Core?
  • Jak przebudować kwerendę w Sequelize, która pobiera historię zamówień wraz ze szczegółami produktów, aby zminimalizować problemy z zapytaniami N+1?

Informacja zwrotna: Asystent optymalizatora zapytań

Aby pomóc nam udoskonalić i ulepszyć narzędzie GitHub Copilot dla rozszerzenia MSSQL, użyj następującego szablonu problemu GitHub, aby przesłać swoją opinię: GitHub Copilot Feedback

Podczas przesyłania opinii należy wziąć pod uwagę następujące kwestie:

  • Przetestowane scenariusze — daj nam znać obszary, na przykład tworzenie schematu, generowanie zapytań, zabezpieczenia, lokalizację.
  • Co się udało — opisz wszelkie doświadczenia, które przebiegły sprawnie, były pomocne lub przerosły twoje oczekiwania.
  • Problemy lub błędy — obejmują wszelkie problemy, niespójności lub mylące zachowania. Zrzuty ekranu lub nagrania ekranu są szczególnie przydatne!
  • Sugestie dotyczące poprawy — podziel się pomysłami na poprawę użyteczności, rozszerzaniem zasięgu lub ulepszaniem odpowiedzi w usłudze GitHub Copilot.