Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Αργή Εκτέλεση Queries σε SQL Server CE 2.0

Îåêßíçóå áðü ôï ìÝëïò Frontier. Τελευταία δημοσίευση από το μέλος KelMan στις 10-12-2007, 15:33. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  10-12-2007, 00:13 38144

    Αργή Εκτέλεση Queries σε SQL Server CE 2.0

    Γεια σας,

    Έχω μια βάση δεδομένων σε SQL Server CE 2.0, η οποία είναι αρκετά μεγάλη σε μέγεθος.
    Ουσιαστικά, το πρόβλημα είναι ένας πίνακας, ο οποίος έχει περίπου 45000 εγγραφές.

    Έστω ότι έχω δύο πεδία σε αυτόν τον πίνακα, το Code και Barcode (ναι, καλά καταλάβατε, πρόκειται για πίνακα ειδών εμπορικής διαχείρισης). Και τα δύο είναι τύπου nvarchar μήκους 20 χαρακτήρων.
    Το Code περιέχει strings της μορφής xxxxx (5-ψήφιο αριθμητικό), ενώ το Barcode της μορφής yyyyyyyyyyyyy (13-ψηφία, αριθμητικό).

    Το πρόβλημα με τον SQL Server CE είναι ότι δεν έχει τρόπους να περιορίσει τον αριθμό των εγγραφών που ο Query Compiler θα φέρει (π.χ LIMIT), οπότε αναγκαστικά χρησιμοποιώ την WHERE με "απόλυτες" αναζητήσεις (αποφεύγω δηλ. την LIKE, μιας που έχει ένα μικρό performance hit).

    Παρατηρώ την εξής συμπεριφορά στα εξής δύο queries, τα οποία επιστρέφουν την ίδια εγγραφή, αλλά γίνεται αναζήτηση διαφορετικά:

    SELECT Code,BarCode WHERE Code='12345'                       -   Χρόνος εκτέλεσης: <1 sec
    SELECT Code,BarCode WHERE BarCode='1234567890123'      -   Χρόνος εκτέλεσης: >25 sec

    Δεν μπορώ να καταλάβω τι στραβό κάνω στη δεύτερη περίπτωση και έχω τέτοια διαφορά στην ταχύτητα εκτέλεσης.
    Η σχέση Code και BarCode είναι 1:1 (όσον αφορά τα δεδομένα).

    Oι δοκιμές γίνονται σε ένα WM2005 PPC με 64MB RAM και τη βάση αποθηκευμένη στην Storage Card.

    Έχει κανείς καμιά ιδέα τι μπορεί να φταίει και πως μπορώ να ξεπεράσω το πρόβλημα;

    Ευχαριστώ εκ των προτέρων.

    Best Regards,
    Manos S. Pappas
    ClubPocketPC.gr - Mobile Development Admin
  •  10-12-2007, 01:02 38146 σε απάντηση της 38144

    Απ: Αργή Εκτέλεση Queries σε SQL Server CE 2.0

    Δεν μας είπες τι γίνεται με το κλειδί του πίνακα και με τα indexes. Θα υπέθετα ότι το πεδίο Code έχει κάποιο index - ίσως λόγω primary key - και γι αυτό επιστρέφει πολύ γρήγορα το αποτέλεσμα σε αντίθεση με το πεδίο BarCode που δεν έχει index και γι αυτό κάνει αναζήτηση σε όλες τις εγγραφές από την αρχή ως το τέλος κάθε φορά και γι αυτό επιστρέφει αποτέλεσμα με μεγάλη καθυστέριση.

     


    Vir prudens non contra ventum mingit
  •  10-12-2007, 08:13 38155 σε απάντηση της 38146

    Απ: Αργή Εκτέλεση Queries σε SQL Server CE 2.0

    Καλημέρα και καλή εβδομάδα,

    Όχι, το code δεν είναι primary key. Το primary key είναι άλλο πεδίο (int). Το code όπως έγραψα, είναι ένα απλό πεδίο nvarchar(20) όπως και το Barcode.
    Η διαφορά της συμπεριφοράς - όπως φαίνεται τουλάχιστον - οφείλεται στο διαφορετικό μήκος του αλφαριθμητικού αναζήτησης (5 χαρακτήρες για το code, 13 για το Barcode).
    Αυτό όμως δεν είναι λογικό, γιαυτό έχω μπερδευτεί.

    Best Regards,
    Manos S. Pappas
    ClubPocketPC.gr - Mobile Development Admin
  •  10-12-2007, 15:33 38165 σε απάντηση της 38155

    Απ: Αργή Εκτέλεση Queries σε SQL Server CE 2.0

    Καταρχήν, το ίδιο συμβαίνει για κάθε αναζήτηση που κάνεις; Η σύγκριση στα πεδία χαρακτήρων γίνεται χαρακτήρα προς χαρακτήρα. Ανάλογα με την κατανομή των τιμών, ενδέχεται να σταματάει η σύγκριση στον δεύτερο χαρακτήρα ή στον δέκατο τρίτο. Είναι εύλογο ότι στη δεύτερη περίπτωση χρειάζεται περισσότερος χρόνος για να βγει το αποτέλεσμα αν κάνει 40.000 x 13 συγκρίσεις. Όπως και να έχει, βάλε ένα unique index (νομίζω υποστηρίζονται στον SQL Server CE 2.0) πάνω στα δύο πεδία. Επίσης, μπορείς να έχεις ένα computed column με checksums ώστε να βοηθήσεις την αναζήτηση.


    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems