pavlos1908 Δημοσ. 28 Δεκεμβρίου 2019 Δημοσ. 28 Δεκεμβρίου 2019 Καλησπερα, Εχω αναλαβει μια πτυχιακη οπου ενας χρηστης συνδεεται σε μια (οποιαδηποτε) βαση δεδομενων (πραγμα που σημαινει οτι δεν εχουμε κανενα access στην βαση δεδομενων για να αλλαξουμε εκει πραγματα), και πραγματοποιει ο,τι SQL Query θελει ωστε να διαβασει δεδομενα. Τα queries μπορει να ειναι οποιασδηποτε μορφης, απλα χρησιμοποιουμε το LIMIT 50 ωστε να δειχνουμε 50-50 τα αποτελεσματα στον χρηστη ο οποιος παει "παρακατω" με scrolling. Το προβλημα που αντιμετωπιζω, ειναι οτι σε παρα πολυ μεγαλα tables, απο οτι μου ειπε ο καθηγητης, ενα οποιοδηποτε query πρωτα θα κανει parse ολο το table και μετα θα επιστρεψει τα tuples που κανουν match το WHERE clause. Οπως αναφερεται και σε ενα report: "So, we have to deal with the overhead of parsing the whole table, even though we only want the first 50 macthes." Τα ερωτηματα μου ειναι: 1) Ισχυει αυτο; Οτι θα γινει parse ολο το table και μετα θα αρχιζουν να επιστρεφονται τα αποτελεσματα; 2) Αν ναι, υπαρχει τροπος μεσω κωδικα πχ Java ωστε να λυθει το θεμα αυτο ειτε επιστρεφοντας μονο τα πρωτα Χ που κανουν match καθε φορα χωρις να διαβαζει ολο το table, ή να διαβαζει 1000-1000 tuples πχ και να επιστρεφει τα αντιστοιχα; 3) Ειδαλλως, ο μονος τροπος να λυθει το προβλημα αυτο ειναι μεσω SQL Query Rewriting; Στο ιδιο report αναφερεται για παραδειγμα οτι: "SELECT movieID FROM movie WHERE year>2000 LIMIT 0,50; A way to avoid this, is transforming the query into the following: SELECT movieID FROM ( SELECT movieID,year FROM movie LIMIT 50) t1 WHERE t1.year>2000;" Το απο πανω query ειναι απλως ενα παραδειγμα, δεν θα ειναι ολα τοσο απλα. Κατα ποσο ομως ειναι αυτο υλοποιησιμο απο πλευρας κωδικα ωστε να γινεται αυτοματα, δεδομενου οτι δεν γνωριζουμε καθολου ουτε τι queries θα φτιαξει ο χρηστης ουτε τι tables/βασεις δεδομενων θα επισκεπτεται; Ευχαριστω πολυ για τον χρονο σας.
albNik Δημοσ. 28 Δεκεμβρίου 2019 Δημοσ. 28 Δεκεμβρίου 2019 (επεξεργασμένο) Εξαρτάται απο τη συνθήκη μεσα στο where. Πραγματι για τυχαία πεδία που δεν εχουν αποθηκεύτει με καποιο indexing θα γινει parse όλο το table. Αν εχεις ενα primary key auto increment id τότε η where id>10 ειναι παρα πολυ γρήγορη. Ο ερώτηση σου ειναι πολυ γενικη. Πρεπει η βαση να εχει σχεδιαστεί ετσι ωστε να επιστρέφει γρηγορα τα συγκεκριμένα queries (μετα ισως να μην εχεις γρηγορα inserts!!). Οσον αφορα το 3) οι database engines ειναι πολυ εξυπνες ωστε να κανουν τετοιο transform. Επεξ/σία 28 Δεκεμβρίου 2019 από albNik 1 1
pavlos1908 Δημοσ. 29 Δεκεμβρίου 2019 Μέλος Δημοσ. 29 Δεκεμβρίου 2019 19 ώρες πριν, albNik είπε Εξαρτάται απο τη συνθήκη μεσα στο where. Πραγματι για τυχαία πεδία που δεν εχουν αποθηκεύτει με καποιο indexing θα γινει parse όλο το table. Αν εχεις ενα primary key auto increment id τότε η where id>10 ειναι παρα πολυ γρήγορη. Ο ερώτηση σου ειναι πολυ γενικη. Πρεπει η βαση να εχει σχεδιαστεί ετσι ωστε να επιστρέφει γρηγορα τα συγκεκριμένα queries (μετα ισως να μην εχεις γρηγορα inserts!!). Οσον αφορα το 3) οι database engines ειναι πολυ εξυπνες ωστε να κανουν τετοιο transform. Σε ευχαριστω για την απαντηση. Οσον αφορα την ερωτηση, δυστυχως αυτη μου εχει γινει απο τον καθηγητη και οχι κατι πιο συγκεκριμενο. Αρα αν καταλαβα σωστα, απο την πλευρα του client δεν υπαρχουν πολλα που μπορουν να γινουν, μονο απο την πλευρα της database οσα μπορουν ή γινονται ηδη (οπως το 3 πχ), σωστα; Ειδικα απο την στιγμη που δεν γνωριζουμε καθολου ουτε τι βασεις θα επισκεφτει ο καθε χρηστης.
archer100 Δημοσ. 29 Δεκεμβρίου 2019 Δημοσ. 29 Δεκεμβρίου 2019 Δες και εδω: https://stackoverflow.com/questions/59429844/method-to-not-parse-the-whole-table-for-an-sql-query-in-java-jdbc
pavlos1908 Δημοσ. 30 Δεκεμβρίου 2019 Μέλος Δημοσ. 30 Δεκεμβρίου 2019 Στις 29/12/2019 στις 3:12 ΜΜ, archer100 είπε Δες και εδω: https://stackoverflow.com/questions/59429844/method-to-not-parse-the-whole-table-for-an-sql-query-in-java-jdbc Εγω την εκανα και αυτην την ερωτηση αλλα για να ειμαι ειλικρινης δεν καταλαβα 100% την απαντηση σε αυτο που ρωτησα και εδω στο 2ο μηνυμα μου. Θελω να μπορω να παρουσιασω στον καθηγητη αν δεν ειναι εφικτο αυτο που μου ζητειται ωστε να το κατανοησει.
Aztec Δημοσ. 8 Ιανουαρίου 2020 Δημοσ. 8 Ιανουαρίου 2020 (επεξεργασμένο) Στην περίπτωση που μιλάμε για client εφαρμογή και δεν έχεις καμία ιδέα για το query που θα γράψει ο χρήστης μάλλον πρέπει να χρησιμοποιήσεις τις δυνατότητες του driver που χρησιμοποιεις . Δες εδώ πως λειτουργει ο SQL Developer. Αντίστοιχα λειτουργούν και άλλα SQL client tools . Επεξ/σία 8 Ιανουαρίου 2020 από Aztec
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα