Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Сегодня разнообразные открытые СУБД встают лицом к лицу против массивных, неуклюжих и дорогостоящих «корпоративных» систем, таких как SQL Server и Oracle. Часто открытые СУБД прекрасно работают лучше закрытых систем, не уступая даже в функциональных возможностях.
У меня есть друг. Его зовут Роб Салливан и он DBA. Вместе с ним мы провели небольшой эксперимент: загрузили в Postgres архив данных StackOverflow, содержащий шесть миллионов текстовых записей. После этого мы расчехлили свои инструменты (для запросов к базе данных) и начали оптимизировать нашу систему, сравнивая её поведение с поведением SQL Server. Postgres не просто показал сравнимую производительность, он во многих случаях значительно превзошёл решение от Microsoft!
Гуглим по Postre vs SQL server и находим кучу сравнений
Почти всегда — закономерно не в пользу последней кроме странных синтетических случаев.
А что в этом закономерного?
Но задачи у PostgreSQL и MS SQL/Oracle те же.
… и всем по-прежнему все равно. Я к тому, что на корпоративном рынке мало кто руководствуется благом техническим.
Правильное название — PostgreSQL или Postgres, но не “postgre”.:)
А MSSQL при этом оптимизировали, или нет? И где результаты тестов в цифрах?
<sarcasm>> К счастью, с этими вещами у Postgres полный порядок.
</sarcasm>
CREATE TABLE tblПотоки (
pk_поток SERIAL PRIMARY KEY,
fk_надПоток INTEGER REFERENCES tblПотоки(pk_поток),
fk_учебныйГод INTEGER REFERENCES tblУчебныеГода(pk_учебныйГод) NOT NULL,
fk_факультет INTEGER REFERENCES tblФакультеты(pk_факультет) NOT NULL,
название TEXT NOT NULL,
дополнение HSTORE,
UNIQUE(fk_учебныйГод, fk_факультет, название)
);
CREATE TABLE tblГруппы (
pk_группа SERIAL PRIMARY KEY,
fk_формаОбучения INTEGER REFERENCES tblФормыОбучения(pk_формаОбучения) NOT NULL,
fk_специальность INTEGER REFERENCES tblСпециальности(pk_специальность) NOT NULL,
курс INTEGER NOT NULL,
комм BOOLEAN NOT NULL,
колБюджет INTEGER NOT NULL,
колКомм INTEGER NOT NULL,
дополнение HSTORE
) INHERITS (tblПотоки);
CREATE TABLE tblПодгруппы (
pk_подгруппа SERIAL PRIMARY KEY,
fk_группа INTEGER REFERENCES tblГруппы(pk_группа) NOT NULL,
fk_разбиение INTEGER REFERENCES tblРазбиения(pk_разбиение) NOT NULL,
колБюджет INTEGER NOT NULL,
колКомм INTEGER NOT NULL,
дополнение HSTORE
) INHERITS (tblПотоки);
CREATE VIEW vwПотоки AS
WITH RECURSIVE Потоки(fk_поток, fk_группа, fk_подгруппа) AS (
(SELECT
tblГруппы.pk_поток, tblГруппы.pk_группа, NULL
FROM
tblПотоки tbl1 INNER JOIN tblГруппы ON tbl1.pk_поток = tblГруппы.pk_поток)
UNION
(SELECT
tblПодгруппы.pk_поток, NULL, tblПодгруппы.pk_подгруппа
FROM
tblПотоки tbl2 INNER JOIN tblПодгруппы ON tbl2.pk_поток = tblПодгруппы.pk_поток)
UNION ALL
SELECT
tbl3.fk_надПоток, Потоки.fk_группа, Потоки.fk_подгруппа
FROM
tblПотоки tbl3 INNER JOIN Потоки ON tbl3.pk_поток = Потоки.fk_поток
WHERE
tbl3.fk_надПоток IS NOT NULL
)
SELECT
*
FROM
Потоки;
А теперь дружно подумаем, почему если есть такие замечательные бесплатные средства как MySQL & Postgres, большие серьезные компании настойчиво продолжают использовать Oracle или MS SQL?
Есть какое то другое объяснение.
Админы умеют то, что надо уметь.
EXPLAIN и сравнить работу двух оптимизаторов. Думаю, это достаточно формальный критерий для принятия решения.
Поприветствуйте вашего старого нового друга