Anteckningar om databashanterare

Diverse anteckningar rörande några olika SQL-databashnaterare.

RDBMS Port Admin user Admin pwd System DB Template DB Terminology
PostgreSQL 5432 postgres <depends> postgres template1 cluster -> database -> schema
Microsoft SQL Server 1433 sa <blank> master model database engine -> database -> schema
Oracle Database 1521 system manager system   instance -> schema(/role)
MySQL 3306 root <blank> mysql   server -> database/schema
IBM DB2 446 db2inst1 ?     instance/manager -> database -> schema

Integration

Att ansluta till datakällor utanför databasen.

RDBMS Service or technique for connecting external data sources
PostgreSQL Foreign Data Wrapper (FDW), tidigare användes dblink för PG <-> PG datakällor
Microsoft SQL Server SQL Server Integration Services (SSIS), gjordes tidigare med Data Transformation Services (DTS)
Oracle Database Database Links
MySQL ?
IBM DB2 Federation

Support, End Of Life och RDBMS Version

PostgreSQL

select version()

Microsoft SQL Server

Version name Internal Version Compatibility Levels EOL Extended EOL
2000 80 -- 2008-04-08 2013-04-09
2005 90 60 65 70 80 90 2011-04-12 2016-04-12
2008 100 80 90 100 2014-07-08 2019-07-09
2012 110 90 100 110 2017-07-11 2022-07-12
Sources:
select @@VERSION
select name, compatibility_level from sys.databases

Oracle

select * from v$version

Datatyper

Detta är inte en total jämförelse. Jag har försökt undvika att ta med förlegade datatyper.

Database Integer Floating point Decimal String Binary Date/Time Boolean Other
PostgreSQL smallint, integer, bigint real, double precision decimal, numeric char, varchar, text bytea date, time, timestamp, interval boolean enum, point, line, lseg, box, path, polygon, circle, cidr, inet, macaddr, bit, uuid, xml, arrays
Microsoft SQL Server tinyint, smallint, int, bigint float, real numeric, decimal, smallmoney money nvarchar, varchar binary, varbinary, filestream date, time, datetimeoffset datetime2 bit cursor, timestamp, hierarchyid, uuid, sql_variant, xml, table
Oracle Database number binary_float, binary_double number char, varchar2, clob, nclob, nvarchar2, nchar blob, raw, longraw, bfile date, timestamp, interval N/A spatial, image, audio,video, dicom, xmltype
MySQL tinyint, smallint, mediumint, int, bigint float, double decimal char, binary, varchar, varbinary, text, tinytext, mediumtext longtext tinyblob, blob, mediumblob longblob datetime, date, timestamp, year boolean (tinyint) enum, set, gis data types

Not.: PostgreSQL och Oracle hanterar också tidszon med WITH TIMEZONE för date/time-typer

Källa: Wikipedia: Comparison of RDBMS

Versionshantering av databas-schema

Versionshantering av databas-schemat är en viktig del i utveckling- och underhålls-arbetet av en applikation.

En utvecklare måste alltid kunna plocka ut den senaste koden och testköra den mot en fräsch och opåverkad databas.

En utvecklare måste alltid kunna laborera och ändra databas- schemat utan att behöva oroa sig för att störa sina kollegors arbete.

För att åstadkomma detta bör databas-schemat, grunddata samt eventuell testdata, versionshanteras tillsammans med övrig applikationskod. Varje utvecklare bör också köra mot en egen databas för att vara ostörd samt undvika att störa andras arbete.

Under initial utveckling då databasen är i ständig flux behöver man inte versionshantera schmat så länge man ser till att kod och databas-schema är i synk i kodarkivet.

När förvaltningsarbetet kommer i gång är det av största vikt att utvecklare kan plocka ut en specifik version av koden och utifrån den skapa en databas för felsökning etc.

Ett hyfsat bra sätt att göra detta på är att i kodarkivet ha senaste versionens databas-schema samt ett patch-skript för ändringar. När en ny version släpps bokför man detta i en tabell i databasen samt uppdaterar schema-filer/n i kodarkivet och tömmer patch-skriptet.

Jobbar man på ovan beskrivet vis minskar riskerna för konflikter och förvirring. Felkällor vid släpp av nya versioner minskas, felsökning i redan släppta versioner underlättas och man får en bra grund för att ytterligare förstärka sitt arbete med nattliga byggen och automatisk testning.

Exempel på versionstabell

Nedanstående skript kan användas för att skapa en tabell för versionshantering.

Lägg märke till att skriptet måste anpassas beroende på vilken databashanterare som det ska köras i.

I nuvarande utförande fungerar det på PostgreSQL, Oracle samt Microsoft SQL Server.

DROP TABLE db_version;
CREATE TABLE db_version
(
   id integer default 1 not null unique check(id=1),
   -- version number(18,2) not null, -- oracle
   version      numeric(18,2)   NOT NULL, -- mssql, pgsql
   -- upgraded_on  datetime      NOT NULL, -- mssql
   upgraded_on timestamp not null, -- pgsql, oracle
   -- script varchar2(254) not null -- oracle
   script text not null -- mssql, pgsql
);
COMMIT;

-- Insert one initial row works:
insert into db_version(id, version, upgraded_on, script) values(1, 1.00, current_timestamp, 'Initial creation');

-- Verify:
select * from db_version;

-- Make sure check constraint works:
insert into db_version(id, version, upgraded_on, script) values(2, 2.22, current_timestamp, 'Failing insert');

-- Update is the only operation that should work:
update db_version set version=1.123 where id=1;

-- Delete should be prevented by trigger but that's an exercise for another day
delete from db_version;

Prestanda

Microsoft SQL Server

Rensa cache:

CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
DBCC FREESESSIONCACHE
GO

See: Analyzing a Query

PostgreSQL

Pg relies on the OS's disk cache, which it has no way to clear or control.
On Linux, check out the "drop_caches"