Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα!

 

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

Δηλαδή θέλω να προσθέσω ένα ORDER BY και σαν κριτήριο την πράξη με την κόκκινη γραμματοσειρα.. 

 

 

$sql1 = "SELECT Places.name, Categories.name, Places.place_id, Categories.category_id, Places.longitude, Places.latitude 
FROM Places, Categories, Place_Category
WHERE Places.place_id = Place_Category.place_id AND Categories.category_id = Place_Category.category_id 
AND ACOS(SIN(RADIANS(" . $user_lat . ")) * SIN(RADIANS(Places.latitude)) + COS(RADIANS(" . $user_lat . ")) * 
COS(RADIANS(Places.latitude)) * COS(RADIANS(Places.longitude) - RADIANS(" . $user_lon . "))) * 6371 <= " . $radius . " 
GROUP BY Places.name";
 
 
Ευχαριστώ
Δημοσ.
AND ACOS(SIN(RADIANS(" . $user_lat . ")) * SIN(RADIANS(Places.latitude)) + COS(RADIANS(" . $user_lat . ")) * 
COS(RADIANS(Places.latitude)) * COS(RADIANS(Places.longitude) - RADIANS(" . $user_lon . "))) * 6371 <= " . $radius . " 

GROUP BY Places.name

ORDER BY ACOS(SIN(RADIANS(" . $user_lat . ")) * SIN(RADIANS(Places.latitude)) + COS(RADIANS(" . $user_lat . ")) * COS(RADIANS(Places.latitude)) * COS(RADIANS(Places.longitude) - RADIANS(" . $user_lon . "))) * 6371";

 
Εναλλακτικά, μπορείς να του δώσεις ένα alias και να κάνεις ORDER BY alias, αλλά θα πρέπει να το συμπεριλάβεις στο select.

Sorry για την καθυστέρηση, αλλά περίμενα να φορτώσει η υπογραφή σου... :-D :-D :-D

  • Like 1
Δημοσ.

 

AND ACOS(SIN(RADIANS(" . $user_lat . ")) * SIN(RADIANS(Places.latitude)) + COS(RADIANS(" . $user_lat . ")) * 
COS(RADIANS(Places.latitude)) * COS(RADIANS(Places.longitude) - RADIANS(" . $user_lon . "))) * 6371 <= " . $radius . " 

GROUP BY Places.name

ORDER BY ACOS(SIN(RADIANS(" . $user_lat . ")) * SIN(RADIANS(Places.latitude)) + COS(RADIANS(" . $user_lat . ")) * COS(RADIANS(Places.latitude)) * COS(RADIANS(Places.longitude) - RADIANS(" . $user_lon . "))) * 6371";

 
Εναλλακτικά, μπορείς να του δώσεις ένα alias και να κάνεις ORDER BY alias, αλλά θα πρέπει να το συμπεριλάβεις στο select.

Sorry για την καθυστέρηση, αλλά περίμενα να φορτώσει η υπογραφή σου... :-D :-D :-D

 

Κατά πρώτον δούλεψε..! Να σαι καλά!

Κατά δεύτερον μου πέρασε απ το μυαλό να το δοκιμάσω έτσι όπως είπες απ την αρχή, αλλά νόμιζα ότι δεν μπορώ να ταξινομίσω με βάση μιά στήλη που δεν υπάρχει.. Τέλος πάντων!

 

Τέλος αναρωτιέμαι αν αυτή είναι σωστή τακτική από άποψη ταχύτητας.. Δηλαδή αυτή η πράξη τώρα γίνεται 2 φορές για κάθε μια εγγραφή ή κατα την εκτέλεση δε θα έχει διαφορά αν το έκανα  και με alias..?

Ευχαριστώ και πάλι..!

 

Περίεργο που δε σου φορτώνει την υπογραφή μου..!!;)

Δημοσ.

Κατά δεύτερον μου πέρασε απ το μυαλό να το δοκιμάσω έτσι όπως είπες απ την αρχή, αλλά νόμιζα ότι δεν μπορώ να ταξινομίσω με βάση μιά στήλη που δεν υπάρχει.. Τέλος πάντων!

Όταν ένα RDBMS υπολογίζει το αποτέλεσμα μίας select, δημιουργεί διάφορες "προσωρινές" στήλες. Μπορεί να μην καταλήξουν να φαίνονται στο τελικό αποτέλεσμα, αλλά μπορούν εξίσου καλά να συμμετέχουν σε όλες τις υπόλοιπες παραμέτρους του select. Στο τέλος, απομονώνονται μόνο αυτές που εμφανίζονται δίπλα στη λέξη SELECT και επιστρέφονται μόνο αυτές.

Άρα, η στήλη υπάρχει.

Τέλος αναρωτιέμαι αν αυτή είναι σωστή τακτική από άποψη ταχύτητας.. Δηλαδή αυτή η πράξη τώρα γίνεται 2 φορές για κάθε μια εγγραφή ή κατα την εκτέλεση δε θα έχει διαφορά αν το έκανα  και με alias..?

Να σου πω, δεν το έχω μετρήσει. Για έναν απλό λόγο: Αν πρέπει να το κάνεις έτσι, πρέπει να το κάνεις έτσι. Δεν έχεις εναλλακτική.

Εξ άλλου, είναι θέμα του εκάστοτε RDBMS να καταλαβαίνει ότι αυτή είναι μία παράσταση που έχει ήδη υπολογίσει για τη συγκεκριμένη πλειάδα, και δεν χρειάζεται να την ξανα-υπολογίσει.

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

 

Περίεργο που δε σου φορτώνει την υπογραφή μου..!! ;)

Μάλλον έχω χάλια σύνδεση... Έλα! Με ακούς;;; ΈΛΑ! Ε-ΛΑΑΑΑ! (*κλικ*)

Δημοσ.

 

Όταν ένα RDBMS υπολογίζει το αποτέλεσμα μίας select, δημιουργεί διάφορες "προσωρινές" στήλες. Μπορεί να μην καταλήξουν να φαίνονται στο τελικό αποτέλεσμα, αλλά μπορούν εξίσου καλά να συμμετέχουν σε όλες τις υπόλοιπες παραμέτρους του select. Στο τέλος, απομονώνονται μόνο αυτές που εμφανίζονται δίπλα στη λέξη SELECT και επιστρέφονται μόνο αυτές.

Δεν είναι απόλυτα ακριβές αυτό. Τα aliases του SELECT δεν μπορούν να χρησιμοποιηθούν στο WHERE. O λόγος είναι ότι το SELECT εκτελείται μετά το WHERE

Δημοσ.

Δεν είναι απόλυτα ακριβές αυτό. Τα aliases του SELECT δεν μπορούν να χρησιμοποιηθούν στο WHERE. O λόγος είναι ότι το SELECT εκτελείται μετά το WHERE

 

Δεν μίλησα για τα aliases του select.

 

Κατ' αρχάς, όταν λέω select αναφέρομαι σε ολόκληρη την εντολή select, μαζί με το where, το order by, το group by κλπ. Γι αυτό και παρακάτω το διαχωρίζω και λέω "δίπλα στη λέξη SELECT", όπου αναφέρομαι στο SELECT clause, που ναι, εκτελείται τελευταίο, διότι είναι υπεύθυνο για το κομμάτι του projection (Π).

 

Όταν λέω ότι δημιουργούνται "προσωρινές" στήλες εννοώ το εξής: Έστω ότι έχεις

 

create table foo (a int, b int, c int)

και κάνεις

 

select a,b from foo where c=a+b order by c-a

τι θα γίνει;

 

Θα δημιουργηθεί ένα προσωρινό dataset με πέντε πεδία: a, b, c, a+b, c-a.

Για κάθε row του foo:

  • Θα εκτελεστούν οι πράξεις που χρειάζονται για να υπολογιστούν τα δυο τελευταία πεδία
  • Θα αποφασιστεί αν το row πρέπει να συμμετέχει ή όχι (where)
  • Θα αποφασιστεί η θέση του (order by)

Τελικά, θα απομονωθούν τα a,b και θα επιστρέψουν σαν αποτέλεσμα (select).

 

Όλα αυτά θεωρητικά, γιατί ο optimizer μαζί με τα indexes αλλάζουν κατά πολύ τη σειρά των πράξεων, κατά περίπτωση (περισσότερα, στα query plans).

 

Οι c, a+b και c-a είναι "προσωρινές" στήλες, που υπάρχουν όσο εκτελείται η εντολή μας (μην πω πάλι "το select" και μπερδευτείς). Και μπορούν να συμμετέχουν σε όλα τα "κομμάτια" της (εντολής). Στο τέλος φιλτράρονται από αυτό-που-λες-εσύ-SELECT.

Δημοσ.


SELECT Places.name, Categories.name, Places.place_id, Categories.category_id, Places.longitude, Places.latitude, 
ACOS(SIN(RADIANS(" . $user_lat . ")) * SIN(RADIANS(Places.latitude)) + COS(RADIANS(" . $user_lat . ")) * 
COS(RADIANS(Places.latitude)) * COS(RADIANS(Places.longitude) - RADIANS(" . $user_lon . "))) * 6371 

FROM Places, Categories, Place_Category

WHERE Places.place_id = Place_Category.place_id AND Categories.category_id = Place_Category.category_id 

AND ACOS(SIN(RADIANS(" . $user_lat . ")) * SIN(RADIANS(Places.latitude)) + COS(RADIANS(" . $user_lat . ")) * 
COS(RADIANS(Places.latitude)) * COS(RADIANS(Places.longitude) - RADIANS(" . $user_lon . "))) * 6371 <= " . $radius . " 

GROUP BY Places.name

ORDER BY ACOS(SIN(RADIANS(" . $user_lat . ")) * SIN(RADIANS(Places.latitude)) + COS(RADIANS(" . $user_lat . ")) * 
COS(RADIANS(Places.latitude)) * COS(RADIANS(Places.longitude) - RADIANS(" . $user_lon . "))) * 6371 ASC


 

 

Ευχαριστώ και τους δύο για τις απαντήσεις σας..!

'Αρα καταλήγουμε ότι το παραπάνω έκτρωμα(!!) το οποίο μπορεί να εκτελεστεί κανά εκατομμύριο (το λιγότερο) φορές για κάθε ερώτημα, δεν μπορούμε να ξέρουμε αν υπάρχει καλύτερος υπολογιστικά τρόπος να το κάνουμε και πρέπει να το ψάξουμε με δοκιμές.

 

Από σχεδιαστικής άποψης της βάσης δε νομίζω ότι υπάρχει καλύτερος τρόπος να φτιαχτεί..

 

 

Αλλά ας εξηγήσω τι παίζει μήπως έχετε καμιά καλύτερη ιδέα..

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

Έχουμε ένα πίνακα με τις συντεταγμένες κάποιων περιοχών και κάποιες τυχαίες συντεταγμένες κάθε φορά οι οποίες είναι του χρήστη. Έτσι θέλουμε την απόσταση του χρήστη από τις περιοχές της βάσης μας.

Δημοσ.

Εάν θέλεις ταυτόχρονα όλα τα αποτελέσματα, γιατί να κάνεις αυτή την πράξη (εύρεσης απόστασης) σε RBDMS και να μην την κάνεις στην κύρια γλώσσα της εφαρμογής σου; 

 

Εάν θέλεις μόνο όσα αποτελέσματα θα φαίνονται σε ένα container, τότε γιατί να μην πάρεις μόνο αυτά τα αποτελέσματα και να βρεις την απόσταση για αυτά και μόνο (πάλι κάνοντας την πράξη εκτός SQL γλώσσας) ;


Πόσο μάλλον δε εάν μπορείς να κάνεις vectorize τις πράξεις και να τις τρέξεις σε κάποιο DSP/GPU... 

 

Δημοσ.

Εάν θέλεις ταυτόχρονα όλα τα αποτελέσματα, γιατί να κάνεις αυτή την πράξη (εύρεσης απόστασης) σε RBDMS και να μην την κάνεις στην κύρια γλώσσα της εφαρμογής σου; 

Ναι αλλά αν πρόκειται για κάποιο smartphone ας πούμε δε νομίζω ότι είναι σωστό να στείλω όλα τα αποτελέσματα στο smartphone και να κάνει εκεί όλους αυτούς τους υπολογισμούς.. Αν κατάλαβα καλά τι εννοείς!

 

 

Εάν θέλεις μόνο όσα αποτελέσματα θα φαίνονται σε ένα container, τότε γιατί να μην πάρεις μόνο αυτά τα αποτελέσματα και να βρεις την απόσταση για αυτά και μόνο (πάλι κάνοντας την πράξη εκτός SQL γλώσσας) ;

Τα αποτελέσματα που βγαίνουν από το query που εχω βάλει παραπάνω είναι βασικά όλες οι εγγραφές του συγκεκριμένου table. Μέσα στη WHERE εκτός από την πράξη τα άλλα δυο conditions είναι join (αν το λέω σωστά). Οπότε πάλι έχουμε μεγάλο όγκο αποτελεσμάτων..

Δημοσ.

Ναι αλλά αν πρόκειται για κάποιο smartphone ας πούμε δε νομίζω ότι είναι σωστό να στείλω όλα τα αποτελέσματα στο smartphone και να κάνει εκεί όλους αυτούς τους υπολογισμούς.. Αν κατάλαβα καλά τι εννοείς!

 

 

Τα αποτελέσματα που βγαίνουν από το query που εχω βάλει παραπάνω είναι βασικά όλες οι εγγραφές του συγκεκριμένου table. Μέσα στη WHERE εκτός από την πράξη τα άλλα δυο conditions είναι join (αν το λέω σωστά). Οπότε πάλι έχουμε μεγάλο όγκο αποτελεσμάτων..

 

... εκεί που θα τραβάς τα αποτελέσματα μπορείς να τρέξεις μόνο SQL; Άλλη γλώσσα όχι; Και ο CPU δεν θα έχει κάποιο extension για vectorize και float point arithmetics; 

 

Δεν είπε κανείς να τα κάνει ο remote client... 

 

Δημοσ.

 

 

Μια που είσαι σε MySQL, έχεις κοιτάξει τα spatial extensions της;

Δεν τα έχω κοιτάξει αλλά θα τα μελετήσω να δω τι παίζει! Ευχαριστώ!

 

 

... εκεί που θα τραβάς τα αποτελέσματα μπορείς να τρέξεις μόνο SQL; Άλλη γλώσσα όχι; Και ο CPU δεν θα έχει κάποιο extension για vectorize και float point arithmetics; 

 

Δεν είπε κανείς να τα κάνει ο remote client... 

ΟΚ τώρα κατάλαβα.. καλή ιδέα.. οπότε στο server που θα γίνεται το ερώτημα παίρνω όλα τα αποτελέσματα και τα επεξεργάζομαι με διαφορετική γλώσσα, ίσως και php..

Όλα αυτά βέβαια αν παρατηρηθούν μεγάλες καθυστερήσεις και χρειαστεί κάποια βελτιστοποίηση...!

 

Θα κάνω κάποια τεστ αφού δημιουργήσω δοκιμαστικές τιμές στη βάση μου και θα ενημερώσω..!

 

Ευχαριστώ πολύ

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...