Jump to content

MDD

Members
  • Gesamte Inhalte

    168
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von MDD

  1. Moin,

    meine allererste Reaktion wäre zu prüfen ob ich wirklich beides mal die selben Datenbanken und Tabellen (Schemas) abfragen.

     

    Dann würde ich prüfen ob via PHP wirklich die selbe Abfrage auf dem SQL landet oder ob der Interpreter was vermurkst. Da hilft der Profiler, die DMV's oder XEvents.

     

    Du könntest auch die Daten prüfen und vergleiche ob es Auffälligkeiten gibt die auf einen Cross oder Outer join schließen lassen. Das würde für ich auch die unterschiedlichen Ergebnisse erklären.

    Gruß MDD

     

  2. Korrigiert mich wenn ich falsch dran bin. 

    Wenn man das Full-Model fährt und recht große Log-Dateien hat kann ein Verkleinern der Dateien schon Effekt haben.

    Ist das automatische Vergrößern der Datei auf einen sehr kleinen Fixwert eingestellt, z.B. 1 MB, führt das unter Umständen dazu das man eine fragmentierte Datei hat. 

    Ist ein Prozentwert eingestellt und das File ist groß kann das Anfordern von Platz Zeit kosten, was sich auf die Verarbeitungszeit auswirken kann.

    Und ja - das ganze hängt mit dem darunter liegenden HD-System zusammen.

    Regelmäßiges Abschneiden mag diese Effekte haben. Daher sollte die File-Einstellung mit ins Kalkül gezogen werden.

    Gruß MDD

  3. Für mich fehlt bei deiner Abfrage das Zeitkriterium.

    Wenn du nicht willst das zu oft Alarm ausgelöst wird müsstest du die Zeit des letzten Eintrags in der Zieltabelle für diesen Alarm mit dem für den neuen Eintrag vergleichen und nur dann schreiben wenn die Zeitdifferenz x Minuten übertrifft. 

     

    btw: Im not exists Zweig kannst auf die ganzen Spalten in der Abfrage verzichten. Macht die Sache nur unübersichtlicher.

     

    SG

    MDD

    Ausserdem würde ich daran denken dass es vorkommen wird / kann, dass die Übertragung aus irgendeinem Grund unterbrochen wird.

    Wie stellst du sicher, dass dann nicht 100erte Alarm ausgelöst werden?

  4. Okay wer lesen kann ist klar im Vorteil. Du schreibst vom Activity Monitor- also hast du das Studio.

    Du kannst im Studio über den Objekt Explorer die Fragmentierung eines Index in seinen Eigenschaften / Fragmentierung nachsehen.

    Und du kannst schauen ob die Statistiken veraltet sind. 

     

    Das Reorganisieren bzw. Neuerstellen kannst du entweder über das Objektexplorer vornehmen oder per Script

    Abhängig von der Eingesetzten SQL Version entweder mit Alter Index 

    https://docs.microsoft.com/de-de/sql/t-sql/statements/alter-index-transact-sql?view=sql-server-ver15

    oder

    dbcc dbreindex

    https://docs.microsoft.com/de-de/sql/t-sql/database-console-commands/dbcc-dbreindex-transact-sql?view=sql-server-ver15

     

    • Like 1
  5. Moin,

    with leitet in diesem Kontext eine CTE (Common Table Expression) ein.

    Das ist quasi eine Unterabfrage die vor dem eigentlichen Select aufgerufen wird und auf dessen Ergebnis im Select zugegriffen wird. 

    Das Ergebnis der CTE wird kurz im Speicher gehalten und als Tabelle "existing_docs" zur Verfügung gestellt (Siehe dein left outer join).

    In diesem Falle wird existing_docs mit dem Alias ed weiter gekürzt,

     

    Gruß MDD

  6. Du kannst unten satt exec @sql das exec durch ein Print ersetzen und das Statement mal selbst anschauen.

     

    Falls es beim Fehler eine andere Zeile angezeigt hat liegt es wahrscheinlich am Group by, dort steht das nochmal ein @values das ich übersehen habe und du scheinbar auch.

     

    declare @values varchar(1000)
    declare @sql varchar(max)
     
     set @values =replace('G01,AL', ',', CHAR(39) + ',' + CHAR(39))
     
    set @sql = '
    select 
    lb.artikel,
    art.NAME,
    sum(lb.menge) as menge,
    sum(lbe.TOTALELEMVALUE) as Wert,' + char(39) + 
    'mögliche Projekte =' + char(39) +  '[dbo].[udf_anp_Projekte_LBW_WE](lb.artikel, ' + char(39) +  @values + char(39) + ')
    from lagerbelegung lb
    left outer join artikel art on art.artikel = lb.artikel
    left outer join LAGERBELEGUNGELEMENT lbe on lb.PREISGRUPPIERUNGID = lbe.PREISGRUPPIERUNGID
    where lb.lager in (' + char(39) + @values + char(39) +  ')
    and art.artikelgruppe between ' + char(39) + '10000'  + char(39) + ' and '+ char(39) + '99999'  + char(39) + 
    ' group by 
    lb.artikel,
    art.NAME,
    [dbo].[udf_anp_Projekte_LBW_WE](lb.artikel, ' + char(39) +  @values + char(39) + ')
    order by sum(lbe.TOTALELEMVALUE) desc, lb.artikel'
    
    exec (@sql)

     

  7. declare
    @values varchar(1000)
    declare @sql varchar(max)
     
     set @values =replace('G01,AL', ',', CHAR(39) + ',' + CHAR(39))
     
    set @sql = '
    select 
    lb.artikel,
    art.NAME,
    sum(lb.menge) as menge,
    sum(lbe.TOTALELEMVALUE) as Wert,' + char(39) + 
    'mögliche Projekte' + char(39) +  '[dbo].[udf_anp_Projekte_LBW_WE](lb.artikel, ' + char(39) +  @values + char(39) +  ')
    from lagerbelegung lb
    left outer join artikel art on art.artikel = lb.artikel
    left outer join LAGERBELEGUNGELEMENT lbe on lb.PREISGRUPPIERUNGID = lbe.PREISGRUPPIERUNGID
    where lb.lager in (' + char(39) + @values + char(39) +  ')
    and art.artikelgruppe between ' + char(39) + '10000'  + char(39) + ' and '+ char(39) + '99999'  + char(39) + 
    ' group by 
    lb.artikel,
    art.NAME,
    [dbo].[udf_anp_Projekte_LBW_WE](lb.artikel, @values)
    order by sum(lbe.TOTALELEMVALUE) desc, lb.artikel'
    
    exce (@sql)

     

    versuch das mal,

  8. vor einer Stunde schrieb RAST:

    Allerdings findert er nur eine View und nicht zwei Views die in der Testdatenbank sind.

    Dann steht bei der zweiten View das peter_lustig nicht drinnen.

     

     

    Ein Update würde dir vermutlich auch nicht viel bringen, selbst wenn es ginge. Immerhin ist das nur die Definition und nicht die View selbst.

    Was du machen kannst ist vor noch eine Spalte zusammenstellen und dort vor jede View ein Drop dazuschreiben.

    select TABLE_name, REPLACE(view_definition, 'peter_lustig', 'peter_traurig') AS Neues_Create,
    'DROP VIEW IF EXISTS ' + TABLE_NAME as Drops, *
    from INFORMATION_SCHEMA.VIEWS
    where view_definition like '%peter_lustig%'

    Dann kopierst den Inhalt der Spalten "Drops" ins Abfrage-Fenster und gleich dahinter das die Create Abfrage aus der Spalte "Neues_create" und führst es Miteinander aus. Womöglich braucht es zwischen den Drops und den Creates ein "GO" damit zuerst die Alten Views weg sind und dann die neuen erstellt werden können.

     

    Würde dann in etwa so ausschauen

    DROP VIEW IF EXISTS view1
    DROP VIEW IF EXISTS view2
    DROP VIEW IF EXISTS ...
    go
    Create view view1 as Select ... from Peter_traurig.dbo.tabelle1 ....
    Create view view2 as Select ... from Peter_traurig.dbo.tabelle4711 ....
    Create view ....

     

     

    • Like 1
  9. Mir ist gerade aufgefallen dass ich am Schluss das % vergessen habe.

     

    Mit "Aber leider funktioniert das nicht" ist es ein wenig schwierig weiter zu kommen.

    Was funktioniert nicht?

    Funktioniert das Statement nicht oder weißt du nicht wie du es umsetzen musst?

     

    Versuch noch mal das mal das Statement und pass die Datenbanknamen entsprechend an. 

     

    select *, REPLACE(view_definition, 'peter_lustig', 'peter_traurig') AS Neues_Create from INFORMATION_SCHEMA.VIEWS where view_definition like '%peter_lustig%'

     

    Schau ob in der letzten Spalte "Neues_Create" die View so richtig definiert wäre. 

    Gruß MDD

    • Like 1
  10. Hallo

    In einem Schritt die Definitionen zu ändern wird schwierig.

    Aber du kannst sie mittels Cursor auslesen, die View droppen und neu erstellen

     

    select *, REPLACE(view_definition, 'peter_lustig', 'peter_traurig') from INFORMATION_SCHEMA.VIEWS where view_definition like '%peter_lustig%'

     

    Mittels des Namens kannst du die alte View löschen und dann neu anlegen. Die Definition kannst du dann wieder mit sp_sqlexec ausführen und damit die View neu anlegen.

    Ich denke das sollte gehen.

    Gruß MDD

    • Like 1
  11. Guten Morgen

    dafür gibt es extra eine Funktion:

    SELECT DATEADD(MM, [intervallMonaten], [datumLetztePruefung]) FROM ...

     

    Gruß MDD

     

    PS: Unter der Fehler liegt daran, dass die Datenbank ein Datum im Hintergrund als eine laufende Zahl abbildet. Und wenn man da einfach eine Zahl dazuzählt ändert es sich der Gesamtwert aber nicht die richtige stelle im Datum. Zum Beispiel hat der heutige Tag die Nummer 44319

    • Like 2
  12. Dann wirst wohl eher über die Systemtabellen gehen müssen

     

       SELECT 
            st.name [Table],
            sc.name [Column],
            sep.value [Description]
        FROM sys.tables st
        INNER JOIN sys.columns sc ON st.OBJECT_ID = sc.OBJECT_ID
        LEFT JOIN sys.extended_properties sep ON st.OBJECT_ID = sep.major_id
                                             AND sc.column_id = sep.minor_id
                                             AND sep.name = 'MS_Description'
        WHERE st.name = 'Tabellenname';
     

     

     

  13. Guten Morgen

     

    zuerst hänge mich gleich bei den vorherigen Kollegen an. Zusätzlich noch folgende Gedanken

     

    A) Befindet sich die idente Kopie in der selben Datenbank?

     

    B) Frage zum Update-Statement. Kannst du das vereinfacht darstellen? Greift das Statement beim Update der Kopie auch nicht auf die Daten der Orginalzieltabelle zu? Oder wäre es möglich das Bild vom Abfrageplan zu zeigen? 

     

    C) Was noch einen Unterschied machen könnte ist die physische Defragmentierung auf der Platte - abhängig von der Umgebung. Aber das ist schon recht weit hergeholt. Würde auf suboptimale Einstellungen beim automatischen Vergrößern der Datenbank bzw. der Wartung hindeuten. 

     

    D) Unterschiedliche Ausführungspläne lassen mich unterschiedliche Statistiken vermuten. (SQL - selbst erstellte bzw. veraltete) 

     

    E) Kannst du prüfen ob bei beiden Index-Scans gleich viele Pages gelesen wurden (set statistics io on). Das müsste theoretisch der Fall sein bei identen Tabellen. 

     

    Welche Edition des SQL 2008R2 verwendest du? Standard?

     

    Gruß MDD

×
×
  • Neu erstellen...