Announcement

Collapse
No announcement yet.

Tabelle kopieren all inkl.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tabelle kopieren all inkl.

    Hallo zusammen.

    Ich habe eine SQL-Server 2005 DB und möchte dort eine riesige Tabelle (knapp 3 Millionen Einträge) in ein paar kleinere aufsplitten.

    Wie ich eine neue Tabelle inkl. der entsprechenden Daten kopieren kann, hab ich schon herausgefunden.

    [highlight=sql-server]
    select * into Tabelle_B from Tabelle_A
    WHERE (Tabelle_A.ObjektArt = 'M') and Tabelle_A.ObjektID in (select Tabelle_C.WKMaterialID from Tabelle_C)
    [/highlight]
    ich kopier also von A nach B alles, was einen Verweis in C hat. B wird in diesem Schritt angelegt und sieht dann aus wie A.

    B hat aber nun keine Primärschlüssel, Constraints, Trigger und was A sonst noch so alles hat. Das alles benötige ich in B aber auch.
    Gibt es da eine Möglichkeit, das auch alles mit zu kopieren?

  • #2
    Hallo Andreas,

    willst Du nun doch weg von DMO / SMO , damit geht es einfacher.

    Und alles Script ist aber ganz schön viel, da kämen ja noch FullText-Index, Statistiken, Berechtigungen mit zu ....

    Siehe "Script Table definitions using TSQL":
    http://techrepublic.com.com/5208-134...sageID=2591819
    Sieht nicht nur recht umfangreich sondern auch fast vollständig aus.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Originally posted by Andreas Mahr View Post
      Ich habe eine SQL-Server 2005 DB und möchte dort eine riesige Tabelle (knapp 3 Millionen Einträge) in ein paar kleinere aufsplitten.
      Und welchen Vorteil versprichtst du dir davon?

      Comment


      • #4
        Originally posted by Bernhard Geyer View Post
        Und welchen Vorteil versprichtst du dir davon?
        Das es schneller wird. Jeder Zugriff auf die Tabelle dauert knapp 3 Minuten. Das kann man doch keinem zumuten.

        Comment


        • #5
          Originally posted by O. Helper View Post
          Hallo Andreas,

          willst Du nun doch weg von DMO / SMO , damit geht es einfacher.

          Und alles Script ist aber ganz schön viel, da kämen ja noch FullText-Index, Statistiken, Berechtigungen mit zu ....

          Siehe "Script Table definitions using TSQL":
          http://techrepublic.com.com/5208-134...sageID=2591819
          Sieht nicht nur recht umfangreich sondern auch fast vollständig aus.
          ich weiß leider nicht, wie es mit DMO / SMO gehen würde. Wäre mir natürlich lieber.

          Ich versteh leider nicht im geringsten, wie und was dieses Skript (aus deinem Link) macht

          Comment


          • #6
            Das es schneller wird. Jeder Zugriff auf die Tabelle dauert knapp 3 Minuten. Das kann man doch keinem zumuten.
            Dann solltest Du aber erstmal herausfinden, woran es liegt. Meine erste Einschätzung ist, dass es außer jeder menge Aufwand überhaupt nichts bringt. Wenn die Daten fachlich zusammen gehören, müssen sie auch in eine Tabelle.
            Des weiteren sind 3 Millionen Einträge nicht wirklich viel für eine Datenbank. An der Größe liegt es also nicht.
            Damit hätten wir noch folgende Punkte die zu untersuchen wären.
            1. Wie sehen die SQLs aus. Passt die Indizierung?
            2. Wieviele Datensätze werden zurückgeliefert und wieviele davon werden wirklich benötigt
            3. Wie sieht das Netzwerk zwischen Server und Client aus
            4. Wie sieht die Auslastung der Hardware aus? Gibt es Spitzen bei der CPU/Plattennutzung

            In dieser Reihenfolge würde ich vorgehen. Wichtig ist herauszufinden woran es liegt. Das Aufteilen der Daten in unterschiedliche, logisch voneinander getrennten Tabellen ist mit einem Wort zu beschreiben: Müll

            Dim

            PS: Hast Du keine Skripte für deine Tabellen und abhängigen Objekte?
            Zitat Tom Kyte:
            I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

            Comment


            • #7
              Also im Regelfall hab ich eine Tabelle_A die mir in einer Abfrage Select * from Tabelle_A ca. 27.000 Datensätze liefert. Diese Abfrage flutscht in weniger als einer Sekunde durch.
              Nun sollen die entsprechenden Benennungen zu jedem Datensatz ausgegeben werden (zb. ein Name) Diese stehen alle in Tabelle_B (das ist die mit den 3 Mllionen Datensätzen). Diese wird dann hinzugejoint in der Form, das ich nur die Datensätze bekomme, die auch eine Referenz in Tabelle_A haben.
              Ab hier dauert die Abfrage dann knapp 3 Minuten.

              Edit: nein, zu der Datenbank existieren keine Skripte, bzw. es existieren nur Skripte zu den von mir erstellten Tabellen. Was aber die wenigsten sind.

              Comment


              • #8
                Originally posted by dimitri View Post
                In dieser Reihenfolge würde ich vorgehen. Wichtig ist herauszufinden woran es liegt. Das Aufteilen der Daten in unterschiedliche, logisch voneinander getrennten Tabellen ist mit einem Wort zu beschreiben: Müll
                Partionieren könnte er schon, dann bleibt die Tabelle logisch eins, wird aber auf mehrere Filegroups, die auf verschiedenen Laufwerken liegen könnten aufgeteilt. (CREATE PARTITION SCHEME / CREATE PARTITION FUNCTION in BOL)
                Vorrausetzung: Enterprise Edition und mehrere Laufwerke.

                Allerdings ob sich bei nur 3 Millionen Datensätzen der Aufwand lohnt....

                Wenn schon vernünftige Indizes gesetzt sind, vielliecht liegt es ja auch an der Verteilung der Daten.
                Hatte mal den Fall, das in einer Nachschlagtabelle bei 8 Millionen Einträgen 250 verschiedene Wörter dahintersteckten...
                Originally posted by dimitri View Post
                PS: Hast Du keine Skripte für deine Tabellen und abhängigen Objekte?
                Wenn nicht vorhanden, dann sollte man das nachholen...
                im Objectexplorer von SSMS auf die Datenbank gehen, rechte maustaste, dann Tasks dann Skripts generieren...

                Comment


                • #9
                  Partionieren könnte er schon, dann bleibt die Tabelle logisch eins
                  Partitionieren und das hier angesprochene Flickwerk sind auch zwei verschiedene paar Schuhe. Aber bei 3 Millionen Sätzen macht das wirklich nicht viel Sinn.

                  Dim
                  Zitat Tom Kyte:
                  I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                  Comment


                  • #10
                    Ich hab von Indexen keine Ahnung, aber ich bin sicher, das habt ihr euch schon gedacht

                    Die Tabelle um die es sich dreht sieht so aus

                    [highlight=sql]
                    /****** Objekt: Table [dbo].[TM_Benennungen] Skriptdatum: 10/15/2009 13:48:57 ******/
                    SET ANSI_NULLS ON
                    GO
                    SET QUOTED_IDENTIFIER ON
                    GO
                    SET ANSI_PADDING ON
                    GO
                    CREATE TABLE [dbo].[TM_Benennungen](
                    [ObjektArt] [varchar](1) NOT NULL,
                    [ObjektID] [int] NOT NULL CONSTRAINT [DF_TM_Benennungen_ObjektID] DEFAULT (0),
                    [SprachKZ] [varchar](3) NOT NULL,
                    [Textart] [int] NOT NULL CONSTRAINT [DF_TM_Benennungen_Textart] DEFAULT (1),
                    [Benennung] [varchar](255) NULL,
                    [Stand] [datetime] NULL CONSTRAINT [DF_TM_Benennungen_Stand] DEFAULT (getdate()),
                    [Bearbeiter] [varchar](3) NULL,
                    [Gebiet] [varchar](6) NULL CONSTRAINT [DF_TM_Benennungen_Gebiet] DEFAULT ('-'),
                    CONSTRAINT [PK_TM_Benennungen] PRIMARY KEY CLUSTERED
                    (
                    [ObjektArt] ASC,
                    [ObjektID] ASC,
                    [SprachKZ] ASC,
                    [Textart] ASC
                    )WITH FILLFACTOR = 90 ON [PRIMARY]
                    ) ON [PRIMARY]

                    GO
                    SET ANSI_PADDING OFF
                    GO
                    EXEC dbo.sp_addextendedproperty @name=N'MS_Description', @value=N'für mehrere übersetztbare Texte einer Tabelle' , @level0type=N'USER',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'TM_Benennungen' , @level2type=N'COLUMN',@level2name=N'Textart'
                    [/highlight]

                    der einzige Index den ich gefunden habe, ist der auf den zusammengesetzten PK

                    Comment


                    • #11
                      Ich hab von Indexen keine Ahnung,
                      Und wie hast Du gedacht, dass Du dann ans Performancetuning rangehst? Indizes, wie man sie verwendet (und auch wann nicht) das gehört zu den Grundlagen. So wirst Du nie von den schlechten Antwortzeiten runter kommen.

                      Weißt Du welches SQL so lange braucht? Oder sind es mehrere die Probleme machen?

                      Dim
                      Zitat Tom Kyte:
                      I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                      Comment


                      • #12
                        Jedes SQL, das die Tabelle mitnutzt wird so langsam. Von Select * From TM_Benennung mal ganz zu schweigen

                        Comment


                        • #13
                          Probier mal (ausreichende Berechtigung vorrausgesetzt und Aktionen bezgl Deiner Tabelle sollte nach dem letzten Neustart auch stattgefunden haben, damit was im Cache ist das ausgewertet werden kann)
                          Code:
                          SELECT 
                                    X.DBName
                                ,   X.SchemaName   
                                ,   X.TableName   
                                ,   X.Equality_Columns
                                ,   X.InEquality_Columns
                                ,   X.Included_Columns
                                ,   X.Statement
                                ,   X.Unique_Compiles
                                ,   X.User_Seeks 
                                ,   X.User_Scans
                                ,   X.Last_User_Seek
                                ,   X.Last_User_scan
                                ,   X.Avg_total_user_Cost
                                ,   X.Avg_User_Impact
                                ,   X.System_Seeks
                                ,   X.System_Scans
                                ,   X.Last_System_Seek   
                                ,   X.Last_System_Scan
                                ,   X.Avg_Total_System_Cost
                                ,   X.Avg_System_Impact
                                ,   CAST (SPACE(1)+ x.DDL    + SPACE(1) AS XML)          AS DDL
                           FROM (-- @DECLARE @ADBName SYSNAME;
                                 SELECT
                                       DB_NAME (MID.Database_id)                         AS DBName
                                   ,   SCHEMA_NAME(Obj.Schema_ID)                        AS SchemaName 
                                   ,   OBJECT_NAME(MID.OBJECT_ID)                        AS TableName   
                                   ,   MID.Equality_Columns
                                   ,   MID.InEquality_Columns
                                   ,   MID.Included_Columns
                                   ,   MID.Statement
                                   ,   MIGS.Unique_Compiles
                                   ,   MIGS.User_Seeks 
                                   ,   MIGS.User_Scans
                                   ,   MIGS.Last_User_Seek
                                   ,   MIGS.Last_User_scan
                                   ,   MIGS.Avg_total_user_Cost
                                   ,   MIGS.Avg_User_Impact
                                   ,   MIGS.System_Seeks
                                   ,   MIGS.System_Scans
                                   ,   MIGS.Last_System_Seek   
                                   ,   MIGS.Last_System_Scan
                                   ,   MIGS.Avg_Total_System_Cost
                                   ,   MIGS.Avg_System_Impact
                                   
                                   ,   N'CREATE INDEX [IDX_' 
                                                      + OBJECT_NAME (MID.Object_ID)             +NCHAR(95)
                                                      + ISNULL (PARSENAME (SUBSTRING (MID.Equality_columns
                                                                          ,1,LEN(MID.Equality_columns)), 1) 
                                                               ,SPACE(0))                       +N']       -- Fill IndexName there '  
                                   +   NCHAR(13)+ SPACE(3)+NCHAR(79)+NCHAR(78)+SPACE(1)                                          
                                   +   QUOTENAME (SCHEMA_NAME (Obj.Schema_ID)) 
                                   +   NCHAR(46) + OBJECT_NAME(MID.OBJECT_ID) 
                                   +   SPACE(1) + QUOTENAME (ISNULL (MID.equality_columns 
                                                                    +ISNULL (NCHAR(44)+NCHAR(32)  
                                                                            +MID.inequality_columns
                                                                            ,SPACE(0) 
                                                                            )
                                                                    ,MID.inequality_columns
                                                                    )
                                                            ,NCHAR(40)
                                                            )
                                   +   ISNULL (NCHAR(13)+N'   INCLUDE(' + MID.included_columns + NCHAR(41),SPACE(0))         AS DDL 
                          
                          
                                FROM   Sys.DM_DB_Missing_Index_Group_Stats AS MIGS
                                JOIN   SYS.DM_DB_Missing_Index_Groups      AS MIG   ON  MIGS.Group_Handle = MIG.Index_Group_Handle
                                JOIN   SYS.DM_DB_Missing_Index_Details     AS MID   ON  MIG.Index_Handle  = MID.Index_Handle
                                JOIN   SYS.Objects                         AS Obj   ON  Obj.Object_ID     = MID.Object_ID
                               ) AS X

                          Comment


                          • #14
                            Das gibt eine leere Tabelle zurück

                            Comment

                            Working...
                            X