Freigeben über


Schnellstart: Abfrageoptimierer-Assistent

GitHub Copilot hilft Entwicklern, Abfragen zu optimieren und Leistungsengpässe zu analysieren, ohne Expertise in Datenbankinternen zu benötigen, insbesondere Entwickler ohne umfassende Transact-SQL (T-SQL) Expertise. GitHub Copilot kann komplexe SQL-Abfragen aufschlüsseln, Ausführungspläne interpretieren und Indexing-Strategien oder Refaktorisierungsmöglichkeiten vorschlagen. Entwickler können ihre Apps funktional und leistungsfähig halten, während Sie sich auf die Bereitstellung von Features konzentrieren.

Loslegen

Stellen Sie sicher, dass Sie mit einer Datenbank verbunden sind und ein aktives Editorfenster mit der MSSQL-Erweiterung geöffnet ist. Diese Verbindung ermöglicht es dem @mssql Chatteilnehmer, den Kontext Ihrer Datenbankumgebung zu verstehen und präzise und kontextbezogene Vorschläge zu ermöglichen. Ohne Datenbankverbindung verfügt der Chatteilnehmer nicht über das Schema oder den Datenkontext, um aussagekräftige Antworten bereitzustellen.

In den folgenden Beispielen wird die AdventureWorksLT2022 Beispieldatenbank verwendet, die Sie auf der Startseite von Microsoft SQL Server-Beispielen und Communityprojekten herunterladen können.

Um optimale Ergebnisse zu erzielen, passen Sie Tabellen- und Schemanamen an Ihre eigene Umgebung an.

Stellen Sie sicher, dass der Chat das @mssql Präfix enthält. Geben Sie @mssql z. B. gefolgt von Ihrer Frage oder Aufforderung ein. Dadurch wird sichergestellt, dass der Chatteilnehmer versteht, dass Sie sql-bezogene Unterstützung anfordern.

Optimieren der Leistung mit GitHub Copilot

GitHub Copilot bietet mehrere Möglichkeiten, um Entwicklern beim Schreiben von leistungsfähigem, produktionsbereiten Datenbankcode zu helfen, ohne umfassende Kenntnisse in der Abfrageoptimierung oder Ausführungsplananalyse zu benötigen. Unabhängig davon, ob Sie neue Features erstellen oder ein Leistungsproblem untersuchen, kann GitHub Copilot Einblicke anzeigen, Optimierungen empfehlen und dabei helfen, Abfragen in Ihrem vorhandenen Workflow in Visual Studio Code neu zu strukturieren.

Hier finden Sie häufige Anwendungsfälle und Beispiele dafür, was Sie über den Chatteilnehmer fragen können.

Optimieren von Abfragen

Verwenden Sie GitHub Copilot, um Ineffizienzen in SQL- oder objektrelationalen Zuordnungsabfragen (ORM) zu identifizieren und Möglichkeiten zur Verbesserung der Leistung vorzuschlagen. GitHub Copilot hilft Ihnen, T-SQL- und ORM-Best Practices anzuwenden, indem es Sie beim Umschreiben langsamer Abfragen, Empfehlen von Indizes oder Vermeiden von Antipatterns wie kartesischen Verknüpfungen im aktuellen Kontext unterstützt.

Einfaches Beispiel

Optimize the following query:

SELECT *
FROM SalesLT.SalesOrderHeader
WHERE OrderDate > '2023-01-01';

Beispiel zur Indexverbesserung

Suggest indexing improvements for this query:

SELECT ProductID
FROM SalesLT.SalesOrderDetail
WHERE Quantity > 100;

Beispiel für die Verbesserung der Integration

Rewrite this query to avoid a Cartesian join. Make sure the new query follows T-SQL best practices:

SELECT * FROM Customers, Order;

Beispiel für geschachtelte Auswahl

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')
    }
  }
});

Analyse des Ausführungsplans

Ausführungspläne bieten eine detaillierte Übersicht darüber, wie das SQL-Modul Abfragen verarbeitet. GitHub Copilot kann Ihnen dabei helfen, Ausführungspläne zu interpretieren, Engpässe wie geschachtelte Schleifenverknungen zu identifizieren und Verbesserungen basierend auf realen Abfragemustern und Indizierungsstrategien vorzuschlagen.

Sie können die folgende Abfrage als Beispiel verwenden, um den Ausführungsplan mithilfe der Option "Geschätzter/Tatsächlicher Plan" in der MSSQL-Erweiterung zu generieren:

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;

Fügen Sie so viel Kontext wie möglich hinzu, indem Sie die Abfrage aus dem Editor auswählen und die sqlplan Datei in das GitHub Copilot-Chatfenster einschließen, wie in diesem Screenshot gezeigt.

Screenshot eines Ausführungsplanbeispiels in Visual Studio Code.

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.

Sie können die folgende Abfrage als Beispiel verwenden, um den Ausführungsplan mithilfe der Option "Geschätzter/Tatsächlicher Plan" in der MSSQL-Erweiterung zu generieren:

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);

Fügen Sie so viel Kontext wie möglich hinzu, indem Sie die Abfrage aus dem Editor auswählen und die sqlplan Datei in das GitHub Copilot-Chatfenster einschließen, wie in diesem Screenshot gezeigt.

Screenshot eines Ausführungsplans mit geschachtelter Schleifenverknüpfung in Visual Studio Code.

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;

Abfrageumstrukturierung

Umstrukturierungsabfragen mit allgemeinen Tabellenausdrücken (CTEs) können die Lesbarkeit und Wartung verbessern, insbesondere für komplexe Logik oder geschachtelte Unterabfragen. GitHub Copilot kann Ihnen dabei helfen, Ihre vorhandenen Abfragen so umzuschreiben, dass sie CTEs verwenden, ohne die Absicht zu verlieren und die Klarheit zu verbessern.

Innere Auswahl in CTE-Beispiel

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;

HAVING-Klausel für CTE-Beispiel

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;

Aggregationsklausel bei CTE-Beispiel

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;

Code-First Performance-Szenarien

Wenn Sie mit ORMs wie Entity Framework, Prisma oder Sequelize arbeiten, kann die Leistung beeinträchtigt werden, wenn Abfragen nicht optimiert sind. GitHub Copilot hilft beim Erkennen und Beheben von Problemen wie fehlenden Indizes, ineffizienter Filterung und N+1-Problemen in Code-first-Workflows.

Prisma-Beispiel

In a Prisma project, how would you ensure that queries filtering by `OrderDate` in `SalesOrderHeader` are using indexes effectively?

Entity Framework Core(Beispiel)

Using Entity Framework Core, how can you analyze and optimize a LINQ query that retrieves the top 10 customers by total order value?

Sequelize-Beispiel

In Sequelize, how do you restructure a query that fetches order history with product details to minimize N+1 query issues?

Teilen von Erfahrungen

Um uns dabei zu helfen, GitHub Copilot für die MSSQL-Erweiterung zu verfeinern und zu verbessern, verwenden Sie die folgende GitHub-Problemvorlage, um Ihr Feedback zu übermitteln: GitHub Copilot Feedback

Berücksichtigen Sie bei der Übermittlung von Feedback Folgendes:

  • Getestete Szenarien – Teilen Sie uns mit, auf welche Bereiche Sie sich konzentrieren, z. B. Schemaerstellung, Abfragegenerierung, Sicherheit, Lokalisierung.

  • Was gut funktioniert hat – Beschreiben Sie alle Erfahrungen, die sich reibungslos, hilfreich fühlen oder Ihre Erwartungen überschritten haben.

  • Probleme oder Fehler – Schließen Sie alle Probleme, Inkonsistenzen oder verwirrende Verhaltensweisen ein. Screenshots oder Bildschirmaufzeichnungen sind besonders hilfreich.

  • Verbesserungsvorschläge – Teilen Sie Ideen zur Verbesserung der Benutzerfreundlichkeit, zur Erweiterung der Abdeckung oder zur Verbesserung der Antworten von GitHub Copilot.