Jump to content

ukulele

Members
  • Gesamte Inhalte

    68
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von ukulele

  1. Also zunächst mal habe ich mit LEFT JOINs gearbeitet so das der Hauptdatensatz deines originären Selects auf jeden Fall angezeigt wird. Dann habe jeweils zwei Join-Bedingungen weil es in der View n verknüpfte Datensätze gibt von denen ich aber nur einen bestimmten brauche.

     

    Das ganze musste in zwei verschiedene Spalten (Fol und Etik) also habe ich die View doppelt gejoint, dazu muss man zwingend mit Tabellen-Aliasen arbeiten.

  2. Du hast also originär 3 Abfragen, meinst du eventuell das hier?

     

    SELECT    VBSVORDT,
            VBSVORZT,
            VBSARTTX,
            VBSHNDKL,
            VBSURSLD,
            VBSPALMG,
            VBSPMENG,
            VBSFPMNG,
            VBSLGANR,
            arttx,
            VBSKUNNR,
            KUNNAME,
            VBSFOLNR,
            VBSFOLET,
            VBSKISZT,
            VBSECKL,
            VBSSANID,
            VBSSANKI,
            v1.PARLFD2 AS FolNr,
            v1.PARINHA1 AS FolTxt,
            v2.PARLFD2 AS EtikNr,
            v2.PARINHA1 AS EtikTxt
    FROM    tbl_VBS
    JOIN    tbl_KUN
    ON        tbl_kun.KUNNR = tbl_vbs.VBSKUNNR
    JOIN    tbl_ART
    ON        tbl_art.ARTNR = tbl_vbs.VBSLGANR
    LEFT JOIN view_PAR v1
    ON        VBSFOLET = v1.PARLFD2
    AND        v1.KEYIPAR1 LIKE 'EVARFFOLIENNUMMER%'
    LEFT JOIN view_PAR v2
    ON        VBSFOLET = v2.PARLFD2
    AND        v2.KEYIPAR1 LIKE 'EVARFFOLIENETIKET%'
    WHERE    VBSADRNR = '005256'
    AND        convert(datetime,convert(char(10),VBSVORDT,104)) BETWEEN convert(datetime,convert(char(10),getdate(),104)) AND dateadd(dd,0,getdate())

  3. Also ich verstehe den Thread nur in etwa bis Post #4, ich glaube du suchst das:

    SELECT    VBSVORDT,
            VBSVORZT,
            VBSARTTX,
            VBSHNDKL,
            VBSURSLD,
            VBSPALMG,
            VBSPMENG,
            VBSFPMNG,
            VBSLGANR,
            arttx,
            VBSKUNNR,
            KUNNAME,
            VBSFOLNR,
            VBSFOLET,
            VBSKISZT,
            VBSECKL,
            VBSSANID,
            VBSSANKI,
            PARLFD2 AS FolNr,
            PARINHA1 AS FolTxt
    FROM    tbl_VBS
    JOIN    tbl_KUN
    ON        tbl_kun.KUNNR = tbl_vbs.VBSKUNNR
    JOIN    tbl_ART
    ON        tbl_art.ARTNR = tbl_vbs.VBSLGANR
    LEFT JOIN view_PAR
    ON        VBSFOLET = view_PAR.PARLFD2
    AND        view_PAR.KEYIPAR1 LIKE 'EVARFFOLIENNUMMER%'
    WHERE    VBSADRNR = '005256'
    AND        convert(datetime,convert(char(10),VBSVORDT,104)) BETWEEN convert(datetime,convert(char(10),getdate(),104)) AND dateadd(dd,0,getdate())

  4. Das ist zunächst mal normal.

     

    Das kann man ändern, ist aber nicht ganz einfach bei einer dynamischen Anzahl an Schauspielern pro Film. In diversen SQL Servern gibt es Funktionen wie GROUP_CONCAT etc. die diese Information aggregieren können. In MSSQL gibt es das so direkt leider nicht aber andere Möglichkeiten. Ein gängiger Trick nutzt XML Path, siehe hier:

    http://sqlandme.com/2011/04/27/tsql-concatenate-rows-using-for-xml-path/

  5. Bei MSSQL gibt es einen grafischen Ausführungsplan, im Management Studio gibt es dafür einen Button. Den kannst du dir ja mal für die unterschiedlichen Selects anzeigen lassen. Wenn sich ein Unterschied bemerkbar macht dann würde ich tippen das NOT IN die langsammste Variante ist.

  6. Dafür gibts einige Wege z.B.:

    SELECT 
    a.id, a.vater, 
    a.benutzer, a.rechner
    FROM beziehungen AS a
    LEFT JOIN beziehungen AS b
    ON a.id = b.vater AND a.benutzer = b.benutzer
    WHERE b.vater Is Null
    

    oder

    SELECT 
    a.id, a.vater, 
    a.benutzer, a.rechner
    FROM beziehungen AS a
    WHERE a.id NOT IN (	SELECT	b.vater 
    					FROM	beziehungen b
    					WHERE	b.benutzer = a.benutzer )
    

    oder

    SELECT 
    a.id, a.vater, 
    a.benutzer, a.rechner
    FROM beziehungen AS a
    WHERE a.id NOT EXISTS (	SELECT	1 
    						FROM	beziehungen b
    						WHERE	b.vater = a.id
    						AND		b.benutzer = a.benutzer )
    
  7. Ein fortlaufender PK mit Index sollte beim Löschen alter Datensätze genauso gut funktionieren wie eine Datumsspalte mit Index. Im ersten Fall musst du aber zusätzlich noch den PK ermitteln der dem Datum löschen bis entspricht, das musst du bei einem Index auf der Datumsspalte nicht.

     

    Das ist aber auch ein Job den man theoretisch Nachts bei niedriger DB Nutzung fahren kann, ich glaube da darf man auch mal einen Full-Table Scan wagen. Es sei denn das soll wirklich mehrfach täglich ausgeführt werden, dann lohnen die Kosten für den Index.

  8. Es sind ja nicht nur Faktoren Speicherplatz und Index Performance (die ich tatsächlich nicht gut selbst einschätzen kann) sondern auch Dinge wie Datenimport / Export. Daher erstmal die Eingangsfrage, was soll dein PK tun? Deine Wahl halte ich nicht für schlecht und mir fehlt selbst etwas das Gefühl für so große Tabellen aber es geht nichts gegen eine vernünftige Zielsetzung und die interessiert mich einfach :-) Vieleicht ist auch kein PK die schnellste Lösung...

  9. Eventuell reicht dir für die erste Software auch eine Express Version aus, die Versionen unterscheiden sich nur in ihrem Funktionsumfang etwas und in der maximalen größe der Datenank sowie in Nutzung von Kernen und RAM. Bei einer kleinen DB und einer Anwendung von der Stange reicht meist auch eine Express Version, technisch wird das nur selten geprüft.

  10. So wie ich das verstehe dürfte deine Standard-Einstellung von 3.000 MB eigentlich keine Verbesserung bewirken sondern ~2.147 MB sollten das Maximum sein. Ich finde auch die VM Konfiguration mit 16 GB nur bedingt sinnvoll wenn "nur" eine 32 Bit DB betrieben wird.

    http://blogs.msdn.com/b/sqlosteam/archive/2012/07/12/memory-manager-configuration-changes-in-sql-server-2012.aspx

     

    Bisher wurde ich aber mit dem Problem auch noch nicht konfrontiert.

  11. In diesem Fall sind die Datentypen der Spalten Anfang und Ende nicht unerheblich. Dies hier müsste aber so in etwa funktionieren:

    SELECT	Jahr,
    		Ort,
    		Produkt,
    		datediff(hour,Anfang,Ende) AS EStd
    FROM	(
    
    SELECT	year(Datum) AS Jahr,
    		Ort,
    		Produkt,
    		Datum + cast(Anfang AS DATETIME) AS Anfang,
    		(	CASE
    			WHEN	Ende <= Anfang
    			THEN	dateadd(day,1,Datum) + cast(Ende AS DATETIME)
    			ELSE	Datum + cast(Ende AS DATETIME)
    			END ) AS Ende
    FROM	Dispo
    
    		) tabelle
    GROUP BY Jahr,Ort,Produkt
    

    Ich habe zunächst mal Anfang und Ende in ein DATETIME Format gebracht um sauber mit datediff() etc. arbeiten zu können. Das muss man natürlich nicht. Im Anschluss habe ich einen Select mit GROUP BY auf diese Abfrage ausgeführt, auch das kann man umstellen.

  12. Zugegeben, Windows ist mitlerweile ein sehr gutes OS und auch die Virtualisierungslösung ist sicher gut und günstig. Ich würde auch niemandem vom Einsatz abraten, bin aber durchaus eher ein Fan von VMware und wollte meine (subjektiven) Argumente und Erfahrungen nicht verheimlichen.

     

    Hyper-V ist ja noch ein vergleichsweise junges Produkt im Markt. Ich bin mir relativ sicher das MS es querfinanziert um Marktanteile zu gewinnen. Gute Software verursacht eben Kosten, darüber sollte man sich immer klar sein. Den Einstieg bekommt man aber gut über ein Testsystem mit kostenloser Lizenz hin.

×
×
  • Neu erstellen...