Benötigen Sie diese Abfrage in SQL Server zu beschleunigen

stimmen
1
SELECT pe.prodtree_element_id prodID, pe.prodtree_element_name_s, li.line_name, av2.value
    FROM prodtree_element pe
    LEFT JOIN prodtree_link pl
        ON pe.prodtree_element_id = pl.to_prodtree_node_id
    LEFT JOIN line li
        ON pe.line_code = li.line_code
    INNER JOIN attribute_values av
        ON av.attribute_definition_id = #statusCode# 
    LEFT JOIN attribute_values av2
        ON pe.prodtree_element_id = av.prodtree_element_id
    WHERE pe.prodtree_element_func_type <> 'WIZARD'
        AND pe.prodtree_element_topo_type = 'NODE'

„# # Status“ ist eine statische ID, die eine ID in der Attributdefinitionstabelle übereinstimmt (lassen Sie sich 22 sagen, für die Zwecke der Beweisführung). Das Problem ist, die Abfrage hat einige massiven Störungen in jeder vernünftigen Menge an Zeit beenden. Das größere Problem ist, ich muß es irgendwie früher beenden, aber die Anzahl der Datensätze ist enorm, dass es (etwa 30-50.000) zurück zu ziehen hat. Ich muss die Daten aus mehreren Tabellen, die ist, wo es zu verlangsamen beginnt. Dies ist nur ein Stück von dem, was ich brauche, ich brauche auch eine ganze andere Tabellen im Wert von Daten des aktuellen „prodtree_elment_id“ entsprechen.

Ich bin mit Coldfusion, sondern auch die Abfrage direkt in SQL Server 2005 die 15-30 + Minuten Wartezeit für diese Abfrage erstellt (wenn es auch beendet). Gibt es eine denkbare Möglichkeit, diese Abfrage zu beschleunigen höchstens 5 Minuten oder weniger zu nehmen?

Veröffentlicht am 09/12/2008 um 20:54
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
0

Ohne die DDL seine sehr schwer zu Test zu wissen. 30-50K Zeilen sollten nur noch wenige Sekunden dauern.

Versuchen Sie, die where-Klausel Bestellung wechseln. Sie sollten wahrscheinlich haben diese umgesetzt

 INNER JOIN attribute_values av
        ON av.attribute_definition_id = #statusCode# 

in der where-Klausel.

Beantwortet am 09/12/2008 um 21:01
quelle vom benutzer

stimmen
0

Das erste, was ich vorschlagen würde, ist, dass man es durch den SQL-Optimierer Dienstprogramm in Enterprise Manager ausgeführt vorausgesetzt, Sie haben, dass installiert. Er schlägt vor, im Allgemeinen Indizes und ähnliches, die eine positive Auswirkung auf die Abfragegeschwindigkeit haben könnte.

Andere Dinge beachten würde die Abfrage werden Aufspaltung. Von der ersten Blicke sieht es aus wie Sie alle Produktelemente lesen, die ein bestimmtes Attribut passende den Wert haben Sie geben (oder so ähnlich). Ich würde vorschlagen, vielleicht:

select * from [bigLongjoin to producttree_element]
where prodtree_element_id
in(
select prodtree_element_id from 
  attribute_values where attribute_definition_id = #statusCode#)

Laufen sie in Enterprise Manager mit der Abfrage-Plan angezeigt könnte Ihnen auch zeigen, wo die Flaschenhälse sind

Beantwortet am 09/12/2008 um 21:03
quelle vom benutzer

stimmen
9

INNER JOIN attribute_values av
    ON av.attribute_definition_id = #statusCode# 
LEFT JOIN attribute_values av2
    ON pe.prodtree_element_id = av.prodtree_element_id

Das ist das Problem. Es ist eine Kreuzung zwischen PE und av, verbinden sie von einer äußeren gefolgt kommen auf die Quer verbinden. Sie haben Glück, es dauert nur 30 Minuten :-)

Ich glaube, Sie dies wünschen:

SELECT pe.prodtree_element_id prodID, pe.prodtree_element_name_s, li.line_name, av2.value
FROM prodtree_element pe
LEFT JOIN prodtree_link pl
    ON pe.prodtree_element_id = pl.to_prodtree_node_id
LEFT JOIN line li
    ON pe.line_code = li.line_code
--replacement
LEFT JOIN
attribute_values av 
         ON pe.prodtree_element_id = av.prodtree_element_id AND
         av.attribute_definition_id = #statusCode# 
--end replacement
WHERE pe.prodtree_element_func_type <> 'WIZARD'
    AND pe.prodtree_element_topo_type = 'NODE'
Beantwortet am 09/12/2008 um 21:05
quelle vom benutzer

stimmen
0

Sie können Millionen von Datensätzen in wenigen Sekunden mit einer guten Optimierung suchen. Obwohl StingyJack ohne zu wissen, die DDL, dass richtig ist, Optimierung einer Abfrage ist hart.

Dinge obwohl zu tun, wenn jedoch eine Abfrage Optimierung der Planausführung ist aussehen. Verschachtelte Schleifen und dergleichen sind schlecht. Auch stellen Sie sicher, dass Sie auch vollständig indiziert sind. Sie erwähnen nichts von den Indizes der Tabellen in Frage. Ohne Indizes 30 - 50k Zeilen könnte eine Weile dauern, mit, dass viele beitritt.

Beantwortet am 09/12/2008 um 21:06
quelle vom benutzer

stimmen
0

sicherstellen, dass alle Ihre IDs Indizes auch, wenn Sie die folgende Karte können:

pe.prodtree_element_func_type <> 'WIZARD'
        AND pe.prodtree_element_topo_type = 'NODE'

so etwas wie

pe.prodtree_element_func_type_ID <> 1
            AND pe.prodtree_element_topo_type_ID = 2

um die String-Vergleiche zu reduzieren, die mehr Zeit in Anspruch nimmt abzuschließen

Beantwortet am 09/12/2008 um 21:07
quelle vom benutzer

stimmen
0
SELECT pe.prodtree_element_id prodID, pe.prodtree_element_name_s, li.line_name, av2.value
    FROM prodtree_element pe
    LEFT JOIN prodtree_link pl
        ON (pe.prodtree_element_id = pl.to_prodtree_node_id)
    LEFT JOIN line li
        ON (pe.line_code = li.line_code)
    LEFT JOIN attribute_values av2
        ON (pe.prodtree_element_id IN (SELECT av.prodtree_element_id FROM attribute_values av WHERE av.attribute_definition_id = #statusCode#))
    WHERE pe.prodtree_element_func_type <> 'WIZARD'
        AND pe.prodtree_element_topo_type = 'NODE'

gbn genagelt es glaube ich. Auch wenn Sie die INNER attribute_values ​​auf einen bestimmten Wert JOIN beschränken, ist es noch gar nicht an Ihre primäre Tabelle oder ihre Beziehungen verbunden. Also selbst wenn Sie Ergebnisse aus der Abfrage bekommen, meine Vermutung ist, dass es zu viele sind.

Je nachdem, was Sie wollten, und wie Sie Ihre Daten in der Tabelle attribute_values ​​entweder seine Abfrage oder Mine würde wahrscheinlich schneller sein.

Beantwortet am 09/12/2008 um 21:15
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more