Jump to content

Split Database


julax
 Share

Recommended Posts

Καλησπέρα και πάλι......

Έχω μία βάση όπου υπάρχει ένας πίνακας με 7 εκ. εγγραφές με αποτέλεσμα η εφαρμογή που βασίζεται σ'αυτήν την ΒΔ όταν κάνει insert μία ομάδα εγγραφών να κολλά ή να αργεί πολύ. Σκέφτηκα να κάνω merge replication αλλά δεν το έχω κάνει ποτέ…

 

Έχετε να μου προτείνετε να κάνω τίποτα άλλο δοκιμασμένο ή να προσπαθήσω να κάνω merge replication ?

Link to comment
Share on other sites

Καταρχήν, το replication δεν έχει να κάνει με split αλλά με αντιγραφή των δεδομένων μίας βάσης σε κάποια άλλη. Επιπλέον, 7 εκ. εγγραφές δεν είναι πολλές. Θα πρέπει να δεις γιατί συμβαίνει η καθυστέρηση. Μήπως συμβαίνει κάτι περίεργο με τα indexes? Μήπως για παράδειγμα έχει επιλεγεί κάποιο περίεργο κλειδί ως clustered index? Πόσο μεγάλη είναι η "ομάδα εγγραφών"? Αν οι εγγραφές είναι πραγματικά πολλές, ίσως θα είναι καλύτερο να ρίξεις τα indexes που υπάρχουν όταν ξεκινάει το φόρτωμα των δεδομένων και να τα ξαναδημιουργήσεις αφού τελειώσει.

 

Link to comment
Share on other sites

... Καλησπέρα σε όλους,

 

Καταρχήν, συμφωνώ με ότι έχει αναφέρει ο κος. pkanavos. Θα πρέπει να κοιτάξεις επίσης στα settings της βάσης, το τρόπο αύξησης μεγέθους της βάσης (Autogrowth).

 

Αν για παράδειγμα το μέγεθος της βάσης είναι 1Gb και το Autogrowth είναι 10% τότε θα κάνει expand την βάση κατά 100MB. Αν είναι 10Gb τότε θα κάνει 1GB. Καταλαβαίνεις ότι σε ένα μαζικό insert παράλληλα θα μεγαλώνει και την βάση οπότε θα καθυστερεί

 

Ευχαριστώ,

Ανδρέας

Link to comment
Share on other sites

Καλημέρα σε όλους και σας ευχαριστώ για τις άμεσες απαντήσεις....

Αντώνη δεν είναι η γνωστή βάση, είναι βάση που έχει το ιστορικό κινήσεων.

Αγαπητέ pkanavos γνωρίζω ότι το replication έχει να κάνει με μεταφορά δεδομένων, όμως το σκέφτηκα αυτό γιατί στην εφαρμογή μπορείς να ορίσεις ποια βάση θα κοιτάει και επειδή άλλος καταχωρεί τα δεδομένα και άλλος κάνει αναζήτηση σκέφτηκα η εισαγωγή να γίνεται σε καθαρή βάση και μετά να γίνεται replication στην "γεμάτη" βάση. Απο τις σχετικά λίγες γνώσεις που έχω στις ΒΔ, θεωρώ ότι η βάση δεν είναι σχεδιασμένη καλά, δεν υπάρχουν κλειδιά ούτε σχετίζονται οι 10 πίνακες. ανέφερες "Αν οι εγγραφές είναι πραγματικά πολλές, ίσως θα είναι καλύτερο να ρίξεις τα indexes που υπάρχουν όταν ξεκινάει το φόρτωμα των δεδομένων και να τα ξαναδημιουργήσεις αφού τελειώσει. " πως το υλοποιώ στην πράξη?

Link to comment
Share on other sites

Δεν θα λύσεις το πρόβλημα σου με αυτό που σκέφτεσαι να κάνεις απλά θα το μεταθέσεις σε άλλη βάση, συν το γεγονός ότι θα έχεις δύο φορές το ίδιο πρόβλημα (καθυστέρησης) όταν θα κάνεις merge replication. Υποψιάζομαι ότι στο πίνακα σου έχεις σαν primary key uniqueidentifier. Αν όντως αυτό ισχύει δες το blog post μου για να καταλάβεις το πρόβλημα σου και άλλαξε το default σε αυτό που προτείνω. Αν πάλι δεν μπορείς να αλλάξεις την δομή της βάσης τότε φρόντισε να μεγαλώσεις το fillfactor στον index του primary key πχ 50%. Αυτό βέβαια θα μεγαλώσει το μέγεθος της βάσης σου αλλά θα σου λύσει το πρόβλημα performance που αντιμετωπίζεις.

Link to comment
Share on other sites

Δυστυχώς Αντώνη ο πίνακας (βασικά όλοι οι πίνακες ) δεν έχουν κλειδιά..... απ'ότι είδα ως CLUSTERED INDEX έχει τον συνδιασμό δύο πεδίων του πίνακα το barcode και το createdate

 

(CREATE CLUSTERED INDEX [tblHistory1] ON [dbo].[tblHistory]

(

    [barcodeId] ASC,

    [CreateDt] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]

GO

).

 

Δεν ξέρω αν θα βόλευε να παραθέσω και την δομή του πίνακα.

 

Link to comment
Share on other sites

Η διαδικασία που ακολουθώ είναι η εξής. Πηγαίνω στον πίνακα ή στο index δεξί κλικ Script Table As... --> New Query

 

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

CREATE TABLE [dbo].[tblHistory](

    [barcodeId] [nvarchar](50) NULL,

    [usrId] [nvarchar](50) NULL,

    [ClientId] [nvarchar](50) NULL,

    [ProjectId] [nvarchar](50) NULL,

    [VoucherNum] [nvarchar](50) NULL,

    [ActionId] [nvarchar](50) NULL,

    [CreateUsrId] [nvarchar](50) NULL,

    [CreateDt] [datetime] NULL,

    [CreateTm] [datetime] NULL,

    [ActionType] [nvarchar](50) NULL,

    [barcodeType] [nvarchar](50) NULL

) ON [PRIMARY]

 

GO

 

ALTER TABLE [dbo].[tblHistory] ADD  CONSTRAINT [DF_tblHistory_VoucherNum]  DEFAULT (1) FOR [VoucherNum]

GO

 

 

 

CREATE NONCLUSTERED INDEX [iX_tblHistory] ON [dbo].[tblHistory]

(

    [barcodeId] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]

GO

 

 

 

 

CREATE NONCLUSTERED INDEX [iX_tblHistory_1] ON [dbo].[tblHistory]

(

    [CreateDt] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]

GO

 

 

 

 

CREATE CLUSTERED INDEX [tblHistory1] ON [dbo].[tblHistory]

(

    [barcodeId] ASC,

    [CreateDt] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]

GO

 

Έχει Statistics και Constaints, μήπως θέλεις να παραθέσω και αυτά?

 

Link to comment
Share on other sites

Σου προτείνω για να λύσεις το πρόβλημα σου να κάνεις τα εξής

  1. Αν η βάση σου είναι auto shrink να το βγάλεις
  2. Να γίνει γεναιόδωρος με το πόσο αυξάνει το μέγεθος της βάσης σου τόσο στο data file όσο και στο log file (πάνω από 30%)
  3. Να αυξήσεις αλλάξεις το fill factor στον cluster index, από 90 που είναι αυτή την στιγμή σε 60.

 

Link to comment
Share on other sites

To εκανα στην demo βαση, τώρα πρέπει να το δοκιμάσω σε κατάσταση παραγωγής και το πρωί επανέρχομαι για να εκθέσω τα αποτελέσματα.

Ευχαριστώ που βοηθάς παντα.

 

Link to comment
Share on other sites

To έκανα και σαφώς λειτούργησε πολύ καλύτερα η εφαρμογή,

έτρεξα το Profiler και παρατήρησα ότι εκτελείται μία εντολή την οποία που δεν

γνωρίζω την χρησιμότητα, η εντολή είναι η εξής

 

 

select 504,c.name,c.description,c.definition from master.dbo.syscharsets c where

c.id = convert(tinyint, databasepropertyex ( db_name() , 'sqlcharset')

 

Γνωρίζει κανείς τι κάνει αυτή η εντολή ?

 

Link to comment
Share on other sites

 Share

×
×
  • Create New...