Jump to content

MDD

Members
  • Gesamte Inhalte

    168
  • Registriert seit

  • Letzter Besuch

Alle erstellten Inhalte 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. Mir ist nicht aufgefallen in den angeführten Artikeln irgendwas über meine erwähnten Effekte stand, was das Allokieren von Speicherplatz anlagt.
  3. MDD

    TSQL Update Problem

    Im Prinzip ist es die selbe Lösung wie deine Abfrage update test set wert = 100 from test join ( select max(stand) as maxDat, persnummer as persnr from test group by persnummer ) as x on x.persnr = test.PersNummer and test.stand = maxDat
  4. 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
  5. 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?
  6. Hallo Was muss schlussendlich in deiner Zieltabelle drinnen stehen? Brauchst du da eine lückenlose Historie? Eine Idee wäre es vielleicht eine zusätzliche Spalte mit einem Triggerflag anzulegen und das nur dann zu setzen wenn es deinen Wünschen (Parametern) entspricht. Dann kannst du aufgrund dessen deinen Trigger auslösen uns sonst eben nicht.
  7. MDD

    Datenbank Wartung?

    Wäre mir ehrlich gesagt neu wenn das mit einem Backup / Restore sich verbessern sollte. Aber kann ich auch nicht 100 %ausschließen.
  8. MDD

    Datenbank Wartung?

    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
  9. MDD

    Datenbank Wartung?

    Hallo möglicherweise sind die Indexe defragmentiert oder die dazugehörigen Statistiken veraltet. Es gilt zu prüfen ob ein Index auch verwendet wird bzw. werden kann. Hilfreich ist dabei das SQL Server Management Studio. Hast du das zur Verfügung?
  10. Hallo Oliver also für den Zugriff würde ich mit dem Stichwort: "openrowset" auf den Weg gehen Für das Prüfen hilft dir womöglich "MERGE" weiter. Gruß MDD
  11. MDD

    Gespeicherte Prozeduren

    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
  12. 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)
  13. Ups habe ein Values übersehen - habe es oben korrigiert - versuchs nochmal
  14. 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,
  15. Strings stehen unter Hochkomma. also 'G01','AL' Dein Statement überliefert aber ein 'G01,AL' womit du wahrscheinlich keine Treffer findest.
  16. 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 ....
  17. 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
  18. 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
  19. Nochmal die Frage: Funktionieren die inkrementellen Backups direkt ohne DPM? Also einfach wenn du sie über das Studio machst?
  20. Guten Morgen, funktionieren die inkrementellen Backups direkt ohne DPM? Wie sagen die Logs?
  21. 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
  22. 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';
  23. Hallo Schau mal auf die View INFORMATION_SCHEMA.COLUMNS Da kannst deine Daten selektieren und dann exportieren. Gruß Mdd
  24. Hallo ... FORMAT(MAX(DATEUPD) ,'dd.MMMM.yyyy HH:mm.ss.fff', 'de-de') AS MAX_DATE würde dir die Information als Datum belassen sie jedoch wie gewünscht formatieren. Gruß MDD
  25. 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...