Markus**: MS-SQL Server Abfrage - Qualität

Ich wüsste gerne wie ihr folgende Abfrage in Hinsicht auf die Qualität bewerten würdet. Letzten Endes geht es einfach nur darum zu ermitteln welche Naturparke in einer bestimmten Ergebnismenge auftauchen.

SELECT DISTINCT  
                      naturparks.id AS id,  
                      naturparke_name AS [Display Name],  
                          (SELECT DISTINCT sublistBnd.name_name + '|'  
                            FROM          jh AS innerJh INNER JOIN  
                                                   sublist_base_naturparke_naturparke AS sublistNat ON sublistNat.reftable_id = innerJh.id_ INNER JOIN  
                                                   sublist_base_naturparke_naturparke_base_naturparke_map AS map ON map.leftid = sublistNat.id_ AND map.rightid = naturparks.id_ INNER JOIN  
                                                   base_bundesländer AS base ON base.id = innerJh.id_bundesland INNER JOIN  
                                                   base_bundesländer_sublist_name AS sublistBnd ON sublistBnd.reftable_id = base.id_  
                            WHERE      innerJh.id_lvb = 8 FOR XML PATH('')) AS [Bundeslaender]  
FROM         jh AS Jh INNER JOIN  
                      sublist_base_naturparke_naturparke AS sublist ON sublist.reftable_id = Jh.id_ INNER JOIN  
                      sublist_base_naturparke_naturparke_base_naturparke_map AS map ON map.leftid = sublist.id_ INNER JOIN  
                      base_naturparke AS naturparks ON naturparks.id_ = map.rightid  
WHERE     Jh.id_lvb = 8  
ORDER BY naturparks.naturparke_name

Sieht mir ganz nach "mit dem Editor schnell zusammengeklickt, aber von Datenbanken keine Ahnung" aus.

Danke und Gruß Markus**

  1. Hi,

    was verstehst du unter "Qualitaet" der Abfrage?

    1. Lesbarkeit / Verstaendlichkeit?
    2. effiziente Resourcennutzung und Geschwindigkeit

    Mit einem Editor wirst du diese Abfrage nicht zusammenklicken koennen, da hat es FOR XML PATH drin.

    zu 1) scheint mir auf den ersten Blick etwas ueberkandideltfuer die banale Anforderung

    Letzten Endes geht es einfach nur darum zu ermitteln welche Naturparke in einer bestimmten Ergebnismenge auftauchen.

    Geht es einfacher. Mit 50%iger Sicherheit, JA. Aber nur unter Kenntnis der zugrundeliegenden Datenstrukturen und der genaueren Anforderungen, wie das Ergebnis aussehen soll. Z.b. dieses Subselect mit den Bundeslaendern scheint mir ein Versuch einer GROUP_CONCAT Sache zu sein. FOR XML ist nich unbedingt der schnellste Operator in MS SQL Server.

    zu 2) das kannst du herausfinden mit dem Ausfuehrungsplan (Execution Plan).

    • wie hoch sind die Kosten (statement subtree cost), wird die Abfrage parallelisiert ausgefuerht
    • gibt es irgendwo Table / Index Scans statt Seeks
    • gibt es teure Sort Operationen, ineffiziente Nested-Loop-Joins (ect. nested loop scans die mehrere 1000x gemacht werden obwohl nur 100 Records rauskommen)
    • gibt es grosse Diskrepanzen zwischen erwarteter Menge an Records und tatsaechlicher Menge
    • gibt es irgendwo grosse (gekennzeichnet durch einen breiteren Pfeil) temporaere Zwischenmengen an Daten
    • wie hoch ist die Kompilierzeit   (SET STATISTICS TIME ON)
    • wieviele logische / physikalische Lesevorgaenge auf den Daten werden gemacht  (SET STATISTICS IO ON), gibt auch Auskunft ob temporaere Tabellen angelegt werden
    • wie lange dauert die Ausfuehrung der Abfrage
    • fehlen Indices auf den Tabellen

    Sind die Kosten <=0.5 und die Ausfuerhungszeit bei <=200ms wuerd ich keine weiteren Untersuchungen anstellen.

    Ciao, Frank

    1. Moin Moin!

      Hi,

      was verstehst du unter "Qualitaet" der Abfrage?

      1. effiziente Resourcennutzung und Geschwindigkeit

      Mit einem Editor wirst du diese Abfrage nicht zusammenklicken koennen, da hat es FOR XML PATH drin.

      Ja, hat es drin, aber völlig sinnfrei, da kommt ohnehin immer nur ein Wert zurück. ;-)

      Ciao, Frank

      Ciao, Markus**