Ανάγκη να επιταχυνθεί αυτό το ερώτημα σε SQL Server

ψήφοι
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'

«# StatusCode #» είναι ένα στατικό id που ταιριάζει με ένα αναγνωριστικό στον πίνακα ορισμού χαρακτηριστικό (ας πούμε 22 για χάρη της συζήτησης). Το πρόβλημα είναι, το ερώτημα έχει κάποια τεράστια προβλήματα φινίρισμα σε κάθε λογικό χρονικό διάστημα. Το μεγαλύτερο πρόβλημα είναι, εγώ κάπως πρέπει να τελειώσει νωρίτερα, αλλά ο αριθμός των εγγραφών είναι τεράστιες ότι πρέπει να σύρει πίσω (περίπου 30-50.000). Χρειάζομαι δεδομένα από πολλούς πίνακες, η οποία είναι όπου αρχίζει να επιβραδύνει. Αυτό είναι μόνο ένα κομμάτι του τι χρειάζομαι, χρειάζομαι επίσης ένα ολόκληρο άλλους πίνακες αξίας των στοιχείων ταιριάζουν με την τρέχουσα «prodtree_elment_id».

Είμαι με τη χρήση ColdFusion, αλλά ακόμα και την εκτέλεση του ερωτήματος άμεσα σε SQL Server 2005 δημιουργεί το 15-30 + λεπτό αναμονή για αυτό το ερώτημα (αν τελειώσει ακόμα). Υπάρχει κάποιο πιθανό τρόπο για να επιταχυνθεί αυτό το ερώτημα για να λάβει το πολύ 5 λεπτά ή λιγότερο εκεί;

Δημοσιεύθηκε 09/12/2008 στις 20:54
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
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

Αυτό είναι το πρόβλημα. Υπάρχει ένας σταυρός ενταχθούν μεταξύ ΡΕ και av, που ακολουθείται από ένα εξωτερικό σύνδεσμο πάνω στο σταυρό ενταχθούν. Είσαι τυχερός που διαρκεί μόνο 30 λεπτά :-)

Νομίζω ότι θέλετε αυτό:

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'
Απαντήθηκε 09/12/2008 στις 21:05
πηγή χρήστη

ψήφοι
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 καρφωμένα νομίζω. Ακόμα κι αν περιορίσει την εσωτερική JOIN να attribute_values ​​σε μια συγκεκριμένη τιμή, αυτό εξακολουθεί να μην ενταχθεί καθόλου στην πρωτοβάθμια τραπέζι σας ή τις σχέσεις του. Έτσι, ακόμα κι αν παίρνουν τα αποτελέσματα από το ερώτημα, η εικασία μου είναι ότι υπάρχουν πάρα πολλά.

Ανάλογα με το τι αποσκοπεί και πώς τα δεδομένα σας είναι στον πίνακα attribute_values ​​είτε ερώτημα του ή το δικό μου θα μπορούσε πιθανότατα να είναι ταχύτερη.

Απαντήθηκε 09/12/2008 στις 21:15
πηγή χρήστη

ψήφοι
0

βεβαιωθείτε ότι όλα τα αναγνωριστικά σας είναι Ευρετήρια επίσης αν μπορείτε να χαρτογραφήσει τα εξής:

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

να είναι κάτι σαν

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

προκειμένου να μειωθούν οι συγκρίσεις String που παίρνει περισσότερο χρόνο για να ολοκληρώσει

Απαντήθηκε 09/12/2008 στις 21:07
πηγή χρήστη

ψήφοι
0

Μπορείτε να αναζητήσετε τα εκατομμύρια των αρχείων μέσα σε λίγα δευτερόλεπτα με καλή βελτιστοποίηση. Αν StingyJack είναι ακριβώς ότι χωρίς να γνωρίζει το DDL, τη βελτιστοποίηση της κάθε ερώτημα είναι σκληρή.

Πράγματα που πρέπει να κάνετε αν κατά τη βελτιστοποίηση ενός ερωτήματος αν είναι να κοιτάξουμε το σχέδιο εκτέλεσης. Ένθετων βρόχων και τα παρόμοια είναι κακό. Επίσης, βεβαιωθείτε ότι είστε πλήρως αναπροσαρμόζονται επίσης. Θα αναφέρω τίποτα από τους δείκτες των πινάκων αυτών. Χωρίς δείκτες 30 - 50k γραμμές θα μπορούσε να πάρει λίγο χρόνο με ότι πολλοί ενώνει.

Απαντήθηκε 09/12/2008 στις 21:06
πηγή χρήστη

ψήφοι
0

Το πρώτο πράγμα που θα ήθελα να προτείνω είναι ότι μπορείτε να εκτελέσετε μέσα από το βοηθητικό πρόγραμμα SQL βελτιστοποίησης στο διευθυντή της επιχείρησης παρέχοντας έχετε το εγκατεστημένο. Προτείνει γενικά δείκτες και τα πράγματα όπως αυτό που θα μπορούσε να έχει θετικό αντίκτυπο στην ταχύτητα του ερωτήματος.

Άλλα πράγματα που εξετάζουν θα κατάτμηση του ερωτήματος. Από την αρχική ματιές φαίνεται σαν να διαβάζετε όλα τα στοιχεία του προϊόντος που έχουν μια συγκεκριμένη ιδιότητα να ταιριάζουν με την τιμή να σας δώσει (ή κάτι τέτοιο). Θα πρότεινα ίσως:

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

Τρέξιμο στο διευθυντή της επιχείρησης με το σχέδιο ερωτήματος που εμφανίζεται μπορεί επίσης να σας όπου οι λαιμοί μπουκαλιών είναι δείξουν

Απαντήθηκε 09/12/2008 στις 21:03
πηγή χρήστη

ψήφοι
0

Χωρίς να γνωρίζει την DDL του πολύ σκληρά για να δοκιμασία. 30-50K σειρές θα πρέπει ακόμα να πάρει μόνο λίγα δευτερόλεπτα.

Δοκιμάστε την αλλαγή της παραγγελίας ρήτρα πού. Θα πρέπει πιθανώς να έχετε αυτό υλοποιείται

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

στη ρήτρα πού.

Απαντήθηκε 09/12/2008 στις 21:01
πηγή χρήστη

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