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

 

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

The maximum number of tables in a query (260) was exceeded

Îåêßíçóå áðü ôï ìÝëïò Bill . Τελευταία δημοσίευση από το μέλος Bill στις 30-04-2009, 22:37. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  30-04-2009, 11:22 50378

    The maximum number of tables in a query (260) was exceeded

      Γνωρίζει κανείς πως μπορούμε να ξεπεράσουμε το παραπάνω πρόβλημα του SQL Server 2000 + SP4. Η Microsoft για το παραπάνω πρόβλημα έιχε βγάλει το SP4 αλλά απλά απο 256 tables το κάνει 260 το όριο πινάκων σε ένα select statement.Επίσης να θεωρηθεί ότι δεν γίνεται να αλλάξουμε το view / query.Στο google που έψαξα κάποιοι κάνουνε μια stored procedure αλλά δεν κατάλαβα και πολλά.Ευχαρηστώ


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  30-04-2009, 11:36 50382 σε απάντηση της 50378

    Απ: The maximum number of tables in a query (260) was exceeded

    Το join πάνω από 260 πινάκων υποδηλώνει από μόνο του ένα πρόβλημα. Τώρα, δυο πιθανές λύσεις (μιας και δεν γίνεται να πειράξεις το query) είναι:

    • Αναβάθμιση σε SQL Server 2005/2008 που υποστηρίζει πολύ περισσότερους πίνακες (δεν θυμάμαι πόσους αυτή τη στιγμή)
    • Δημιουργία temp πίνακα που να περιέχει τα data από τους πρώτους 260 πίνακες και join των υπολοίπων σε αυτόν

    Πάντως, ειδικά αν πρόκειται για reporting, η δεύτερη λύση μου φαίνεται αρκετά εφικτή. Ειδικά αν συνδυαστεί με ένα loading του temp πίνακα κατά τις low-utilization ώρες που λειτουργεί ο server. Παράλληλα, θα διευκολυνθεί ο server όταν θα πρέπει να τρέξει αυτά τα τεράστια queries.


    Vir prudens non contra ventum mingit
  •  30-04-2009, 11:37 50383 σε απάντηση της 50378

    Απ: The maximum number of tables in a query (260) was exceeded

    Γιατί να θεωρηθεί? 

    Όταν εμπλέκεις 260 πίνακες σε ένα query σημαίνει δύο πράγματα και ουσιαστικά ένα. Έχεις ένα πάρα -πάρα πολύ κακό query. Αυτό μπορεί να συμβαίνει είτε επειδή κάποιος έφτιαξε ένα τεράστιο query και έβαλε μέσα και τους 260 πίνακες, ή ότι μία σειρά προγραμματιστών αντί να φτιάχνουν κάθε φορά σωστά queries, έπιαναν ένα view που βόλευε ελαφρώς και το έχωναν σε άλλο με αποτέλεσμα κάποια στιγμή να φτάσει το όριο των 260 πινάκων, πολλοί από τους οποίους επαναλαμβάνοντας 7-8 φορές.

    Όπως και να έχει, έχεις ένα query-καρκίνο και καμμία ασπιρίνη δεν πρόκειται να σε σώσει αν δεν το ξεφορτωθείς. Το πρόβλημα δεν είναι της Microsoft ούτε του 2000. Μπορεί ο SQL 2005 και ο 2008 να έχουν αυξήσει το όριο, αλλά με τέτοιο κακό κώδικα, σύντομα θα ξεπεράσετε οποιοδήποτε είναι το νέο όριο.

    Η μόνη λύση είναι να σταματήσετε άμεσα να χώνετε views το ένα μέσα στο άλλο για λόγους "ευκολίας" και να καθαρίσετε το σχήμα της βάσης. Τα νέα views θα πρέπει να γράφονται χτυπώντας είτε τους πίνακες είτε ένα σετ από συγκεκριμένα, βασικά views.


    Υ.Γ. Αν μου πεις και ότι δουλεύεις σε εταιρεία που φτιάχνει χρηματιστηριακό software ...

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  30-04-2009, 11:56 50385 σε απάντηση της 50383

    Απ: The maximum number of tables in a query (260) was exceeded

    Είναι πολύ εύκολη η θεωρία αλλά δεν εχουμε κανένα query καρκίνο απλά έχουμε μερικά βασικά views και αρκετούς πίνακες καταλαβαίνεις ότι η βάση είναι μεγάλη με πολλά υποσυστήματα. Η αδυναμία της Microsoft στο να επιλύση το συγκεκριμένο πρόβλημα δεν σημαίνει ότι πρέπει αναγκαστικά να έχει προβλημα το query.Επίσης μου ακούγεται καλή ιδέα το παίξω με temporary πίνακα θα το δοκιμάσω.

    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  30-04-2009, 12:05 50386 σε απάντηση της 50385

    Απ: The maximum number of tables in a query (260) was exceeded

    E, καλά όμως, μην γράφουμε ό,τι θέλουμε κι όλας... Το έχει επιλύσει ήδη από τον SQL Server 2005. Από εκεί και πέρα, δεν είπες αν πρόκειται για reporting σκοπούς. Γιατί σε αυτήν την περίπτωση η προτεινόμενη λύση είναι είτε να φτιαχθεί μια δεύτερη βάση που θα περιέχει τα data σε κατάλληλη μορφή denormalized, είτε ένα data mart.
    Vir prudens non contra ventum mingit
  •  30-04-2009, 21:06 50395 σε απάντηση της 50385

    Απ: The maximum number of tables in a query (260) was exceeded

    Δεν είναι θεωρία αλλά πείρα. Έχω αντιμετωπίσει και στο παρελθόν τέτοια κατάσταση και έχω δουλέψει και με βάσεις με πολλές εκατοντάδες πίνακες. Σε όποια βάση και να δουλέψεις, ένα query το οποίο χρησιμοιεί 260 πίνακες είναι προβληματικό. Υπάρχουν πολύ μεγαλύτερα συστήματα όπως το SAP, με χιλιάδες πίνακες, τα οποία δεν πλησιάζουν καν το όριο των 260 πινάκων. Πέρα από υπερβολική πολυπλοκότητα ένα τέτοιο query θα έχει και κακό performance, ανεξαρτήτως βάσης, καθώς θα κλειδώσει πάρα πολλούς πίνακες για μεγάλο χρονικό διάστημα και θα μειώσει πάρα πολύ τα transactions που μπορούν να γίνουν ανά λεπτό.

    Μία λύση είναι όντως να δουλέψεις με temporary πίνακα, και αφού δέχεσαι να το κάνεις αυτό υποθέτω ότι το query μπορεί τελικά να αλλάξει. Μία πολύ καλύτερη λύση, αυτή που χρησιμοποιείται σε όσες εφαρμογές έχουν πολλούς πίνακες και μεγάλο όγκο δεδομένων, είναι να φτιάξεις μία ξεχωριστή βάση με σχήμα φτιαγμένο ειδικά για reporting. Είτε περιοδικά, είτε μέσω κάποιου trigger ή queue, περνάς τις αλλαγές από την transactional στην reporting βάση. Αυτή είναι και η λύση που χρησιμοποιούν και μεγάλες εφαρμογές όπως το SAP αλλά και μικρότερες όπως π.χ. ο Project Server. Έτσι πετυχαίνεις ταχύτητα τόσο για την transactional όσο και για την reporting database αλλά και πολύ ευκολότερη δημιουργία των reports. Τέλος μπορείς να χρησιμοποιήσεις τα Analysis Services για να πετύχεις ακόμα μεγαλύτερη ταχύτητα σε reports που απαιτούν aggregations π.χ. σε επίπεδο εβδομάδας-μήνα-χρόνου, πόλης-νομού-χώρας και όλων των συνδυασμών που μπορείς να φανταστείς.


    Το μόνο στο οποίο έχεις ένα μερικό δίκιο είναι στο ότι η Microsoft δεν πρόκειται να κάνει τίποτε παραπάνω για τον SQL Server 2000, όχι λόγω αδυναμίας αλλά επειδή το προϊόν έχει αποσυρθεί πλέον.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  30-04-2009, 22:37 50397 σε απάντηση της 50395

    Απ: The maximum number of tables in a query (260) was exceeded

    Καταλαβαίνω απόλυτα και έχεις δίκαιο και στο πρώτο post που έγραψες και επίσης είναι δεδομένη η αναγνώριση της εμπειρίας στο πρόσωπο σου τουλάχιστον σε αύτο το forum.Απλά ίσως το διατύπωσα λάθος και ζητώ συγνώμη αν σε πρόσβαλα.Ναι το query σηκώνει βελτίωση δε λέω. Απλά θα ήθελα να έχω όλες τις εναλλκτικές απόψεις πρίν πάρω μια απόφαση και επειδή ήξερα ότι απο την αρχή θα έγραφε κάποιος ότι πρέπει να κάνω αλλαγή στο query για το λόγο αυτό είπα ας αποκλείσουμε αυτό το ενδεχόμενο.
       Στο θέμα μας τώρα. Βασικά δεν κατέληξα σε κάτι αλλά εξετάζω τις επιλογές που μου έδωσες εσύ και ο Kelman.Εκείνο που έχω να πώ είναι ότι πολύ συνάδελφοι σε ξένα forums έχουνε το ίδιο πρόβλημα με τον SQL 2000 κι όταν ένα προϊον δεν το αποσύρει η αγόρα εμείς είμαστε αναγκασμένοι να δείνουμε λύσεις.

    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems