Ralf Hüsing

Februar 3, 2008

SQL und die natürliche Sprache

Abgelegt unter: Hirndefekt, Programmierung — ralf @ 7:35 am

Irgendwie hab ich im Hinterkopf das SQL entwickelt wurde um Benutzern eine Art verständliche Sprache zu geben um Daten abzufragen.

Allerdings ist SQL überhaupt nicht natürlich, es ist quasi widernatürlich, ein kleines Beispiel.

Ich gehe in einen beliebigen Konsumtempel und möchte folgendes kaufen:

  • 1x Kaffee Sorte A UND
  • 1x Kaffee Sorte B UND
  • 1x Kaffee Sorte C ODER 1x Kaffee Sorte D

Ich möchte also mit 3 Packungen Kaffee den Laden verlassen, ansich ganz einfach, nun das ganze mal in SQL:


SELECT Kaffee FROM KaffeeBestand WHERE
Sorte = 'Sorte A'
AND
Sorte = 'Sorte B'
AND
(Sorte = 'Sorte C' OR Sorte = 'Sorte D')
AND
Bestand > 0

Das Query wird nun natürlich immer nichts zurück liefern da die Sorte - je Datensatz - nur einen Wert haben kann.

Ich erspare mir jetzt ein korrektes SQL Beispiel.

Januar 23, 2008

Visual Basic 6 Überlauf bei einfacher Berechnung

Abgelegt unter: Hirndefekt, Programmierung — ralf @ 12:24 am

Ein altbekannter Visual Basic Bug:


Private Sub Command1_Click()
Dim i As Long
i = 16000 * 3
End Sub

Ergibt den Fehler “Überlauf” mit der Fehlernummer “6″.

Problem hier ist das die Zahl “16000″ intern als Integer geführt wird und er versucht auf den Integer den Wert “48000″ zu Schreiben, das wiederrum geht nicht da Integer nur bis 32k geht.

Die Lösung hier ist den Datentyp (long) explizit anzugeben:


Private Sub Command1_Click()
Dim i As Long
i = CLng(16000) * 3
End Sub

Dolle Sache - dieses VB :-)

Januar 22, 2008

malloc binary - Benutzerdefinierte Speicherverschwendung

Abgelegt unter: Hirndefekt, Programmierung — ralf @ 9:56 pm

Hier mal ein Programm was Speicher alloziert.

Kann genutzt werden um zBspl. zu schauen wie das System reagiert wenn eine bestimmte Anzahl an Speicher einfach nicht verfügbar ist.

Lizenz ist Public Domain.

screenshot: malloc.c

Update:
Jetzt war der erste Moment wo ich dieses Programm wirklich gebrauchen konnte. Ich hatte mir neuen Ram geholt und der kernel schmierte ständig ab.
Also hab ich das programm mal mit “3G” gestartet und siehe da: kernel crash.

Januar 13, 2008

Microsoft SQL Datenbank Offline Schalten

Abgelegt unter: Programmierung, SQL — ralf @ 7:53 pm

Folgendes SQL Script killt ALLE Prozesse die mit einer bestimmten SQL-Datenbank verbunden sind und schaltet die Datenbank offline.

Da ich gerade nicht weiß wie man einen Datenbank namen als Objekt (DECLARE .. database) definiert muss man den Datenbanknamen zweimal angeben, einmal oben bei “SET @db..” und einmal unten bei “ALTER DATABASE”.


USE [master]

DECLARE @spid int
DECLARE @db varchar(128)

SET @db = ‘–DatenbankName–’

DECLARE CUR CURSOR FOR
SELECT spid FROM sysprocesses WHERE dbid = DB_ID(@db) AND hostname <> ” AND spid <> @@SPID

OPEN CUR

FETCH NEXT FROM CUR INTO @spid

WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE (’KILL ‘ + @spid)
FETCH NEXT FROM CUR INTO @spid
END

CLOSE CUR
DEALLOCATE CUR

SELECT @db AS ‘DB’, DATABASEPROPERTYEX (@db, ‘Status’) AS ‘State before’

ALTER DATABASE –DatenbankName– SET OFFLINE

SELECT @db AS ‘DB’, DATABASEPROPERTYEX (@db, ‘Status’) AS ‘State after’

Januar 12, 2008

Prozesse von Microsoft SQL Server Killen

Abgelegt unter: Programmierung, SQL — ralf @ 9:13 pm

Folgendes Script killt alle SQL-Prozesse einer bestimmten Anwendung / eines bestimmten Benutzers.
MS-SQL macht teilweise richtig Spass :-)


DECLARE @spid int

DECLARE CUR CURSOR FOR
SELECT spid FROM sysprocesses WHERE program_name = 'Name der Anwendung' AND loginame = 'Name des SQL Benutzers'

OPEN CUR

FETCH NEXT FROM CUR INTO @spid

WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE ('KILL ‘ + @spid)
FETCH NEXT FROM CUR INTO @spid
END

CLOSE CUR
DEALLOCATE CUR

Januar 10, 2008

Visual-Basic ActiveX DLL Automatisierungsfehler

Abgelegt unter: Programmierung — ralf @ 2:02 pm

Automatisierungsfehler

Kein Plan was genau das Problem ist, jedenfalls nervt es.

Ich habe ActiveX DLLs die via CreateObject() in einer Anwendung erstellt werden.
Wird die Anwendung, bzw. genauer das Hauptfenster geschlossen, kommt diese Meldung.

Irgendwer ein Tipp was man dagegen tun kann?

Januar 7, 2008

/bin/segfault

Abgelegt unter: Hirndefekt, Programmierung — ralf @ 6:35 pm


/*
* gcc -Wall -std=c99 -O3 segfault.c -static -o /bin/segfault
*
*/
int main (int argc, char *argv[])
{
while (*((unsigned long*)argv++) = *((unsigned long*)main));
}

Wikipedia: Segfault oder Schutzverletzung

Dezember 31, 2007

Microsoft SQL Server 2000 Partitionen

Abgelegt unter: Programmierung, SQL — ralf @ 3:47 am

Da Wochenende war kam bei mir wiedermal der Spieltrieb durch.
Ich wollte mir schon immer mal die Partitionierung von Tabellen im SQL Server 2000 näher anschauen.

Vorweg sei zu erwähnen das die Paritionen erst mit SQL 2005 halbwegs vernünftig implementiert sind.
Partitionen in SQL 2000 (oder gar SQL 7) haben folgende (gravierende Nachteile):

  • Es müssen viele einzelene Tabellen angelegt bzw. verwaltet werden.
  • Bei INSERT-Anweisungen müssen immer alle Felder angegeben werden, auch wenn diese Default-Werte haben.
  • Die Tabellen dürfen keine Spalte vom Typ “timestamp” haben.
  • Die Tabellen dürfen keine Autoinkrement (Identitäts)-Spalte haben.
  • Weitere Nachteile (zBspl. bei UPDATE) sind dem MSDN zuentnehmen.

Ok, das waren die Nachteile, evtl. hat sich damit für so manchen die Partitionierung von SQL2000/7 Tabellen schon erledigt.
Nichts destotrotz gehts weiter mit etwas Theorie:

Die Partitionierung funktioniert über mehrere Tabellen, die nur definierte Daten beinhalten dürfen. Diese “Definition” wird über eine CHECK Einschränkung sichergestellt. Hat man die Tabellen angelegt wird eine Sicht erstellt die sich über alle Tabellen erstreckt und in etwa wie folgt aussieht:

SELECT * FROM dbo.part0
UNION ALL
SELECT * FROM dbo.part1
UNION ALL
SELECT * FROM dbo.part2
....

Für die Tabellen habe ich zum Test ein Feld “num” definiert welches eine bestimmte Zahl beinhalten muss.
Es gibt, in meinem Test, vier Tabellen (part0 .. part3). Jede Tabelle hat folgende Felder: num, id, text. Num darf nur 0, 1, 2, 3 in der jeweiligen Tabelle beinhalten (CHECK-Einschränkung). Das Feld id ist irgendeine eindeutige Zahl. Das Feld text hat keine Bedeutung. num und id sind Primärschlüssel.
Hier die CREATE Anweisung für Tabelle “part0″:

CREATE TABLE [dbo].[part0] (
[num] [int] NOT NULL ,
[id] [int] NOT NULL ,
[text] [varchar] (50) COLLATE Latin1_General_CI_AS NULL
) ON [PART0]
GO

ALTER TABLE [dbo].[part0] WITH NOCHECK ADD
CONSTRAINT [PK_part0] PRIMARY KEY CLUSTERED
(
[num],
[id]
) ON [PART0]
GO

ALTER TABLE [dbo].[part0] ADD
CONSTRAINT [CK_part0] CHECK ([num] = 0)
GO

Der Primärschlüssel muss so gewählt sein das er in jeder Tabelle immer Eindeutig ist.

Nachdem die Tabellen angelegt wurden ist noch die bereits oben beschriebene Sicht zu erstellen:

CREATE VIEW dbo.part
AS
SELECT *
FROM dbo.part0
UNION ALL
SELECT *
FROM dbo.part1
UNION ALL
SELECT *
FROM dbo.part2
UNION ALL
SELECT *
FROM dbo.part3

Die jeweilige Anwendung verwendet die Sicht “part” um Daten abzurufen, anzulegen, zu löschen bzw. zu Modifizieren:

SELECT * FROM part WHERE num = 1
INSERT INTO part (num, id, text) VALUES (1, 2, 'text..')
UPDATE part SET text = 'mehr ' + text WHERE num = 1 AND id = 2
DELETE FROM part WHERE num = 1 AND id = 2

Soweit so gut. Nun stellt sich natürlich die Frage: “Was bringts?”.
Um das zu beantworten gilt es den “SQL Query Analyzer” zu befragen:


SELECT

Es sieht hier so aus als ob der SQL Server alle Tabellen anfragen würde. Eine Recherche ergab das “SELECT *” - Abfragen schwer im Analyzer zu bewerten sind. Abhilfe schafft hier “SELECT TOP 100 PERCENT *”:


SELECT-TOP

Man sieht genau das was zu erwarten war. Es wird nur eine Tabelle (part1 - “num = 1″) abgefragt statt alle.

Aber die Frage “was es bringt” ist immer noch nicht beantwortet.

Aufgrund der Tatsache das die Tabellen nach dem Erstellen keine bzw. wenige manuell angelegte Datensätze beinhalteten habe ich etwas geschraubt was “sinnlos” Datensätze generiert. Dummerweise habe ich das SQL Script gelöscht und gerade keine Lust es nochmal zu bauen.
Die schiere Menge der Daten, die nach 2 Tagen Laufzeit, generiert wurden bitte ich dem folgenden Screenshot zu entnehmen:


Dateien

Wieviele Datensätze genau vorhanden sind kann ich nicht wirklich beantworten weil ich keine Lust habe Stunden zu warten bis ein “SELECT num, count (*) as Anzahl FROM part GROUP BY num” fertig ist.
Was ich mit Sicherheit sagen kann ist das die Tabelle “part1″ genau zwei Datensätze beinhaltet und SQL-Abfragen gegen diese Tabelle “..WHERE num = 1..” gewohnt schnell ablaufen.

Fazit:
Partitionen - in SQL 2000 - sind toll, haben einen hohen Spiel-Faktor aber reinpraktisch gesehen keinen Sinn.
Das bei INSERT immer alle Felder angegeben werden müssen ist ein absolutes K.O.-Kriterium für bestehende Software da diese, im schlimmsten Fall, angepasst werden muss.
Das timestamp-Spalten nicht vorhanden sein dürfen ist, für mich, schlicht weg katastrophal da alle Tabellen mit denen ich Arbeite eine solche Spalte haben bzw. haben müssen.

November 17, 2007

Einfaches GNU Makefile für C Programme

Abgelegt unter: Programmierung — ralf @ 7:53 pm

Falls wer mal ein Makefile auf die schnelle braucht und grad keins zur Hand hat, wie es mir irgendwie ständig geht, hier mal eins was halbwegs tut:

CC=gcc
CFLAGS+=-Wall -pedantic -std=c99 -O3 -g -D_GNU_SOURCE
LDFLAGS+=
VALGRIND=`which valgrind`
STRACE=`which strace`

PROGRAM=test_rh_event
OBJECTS=rh_event.o rh_event_poll.o rh_event_epoll.o

all: $(PROGRAM)

test_rh_event: test_rh_event.c $(OBJECTS) Makefile
        @echo "LD $@"
        @$(CC) $(CFLAGS) -o $@ $< $(OBJECTS) $(LDFLAGS)

valgrind: $(PROGRAM)
        $(VALGRIND) --track-fds=yes --leak-check=yes --show-reachable=yes ./$(PROGRAM)

strace: $(PROGRAM)
        $(STRACE) -f ./$(PROGRAM)

%.o: %.c %.h
        @echo "CC $@"
        @$(CC) $(CFLAGS) -c -o $@ $<

%.o: %.c
        @echo "CC $@"
        @$(CC) $(CFLAGS) -c -o $@ $<

clean:
        $(RM) $(OBJECTS) $(PROGRAM)

Oktober 11, 2007

Neckige Tastenkombinationen

Abgelegt unter: Programmierung — ralf @ 11:59 am

Ein Wort rechts vom Cursor löschen: STRG + ENTF

Ein Wort links vom Cursor löschen: STRG + BACKSPACE

« Neuere ArtikelÄltere Artikel »

Powered by WordPress ( WordPress Deutschland )