Задать вопрос
  • Как убрать запятую в конце массива?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Как насчёт формировать json не через одно место, а штатными функциями? json_encode
    Ответ написан
    Комментировать
  • Влияет ли директива "max connections" в mysql на работу нескольких сайтов расположенных на одном сервере?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    https://dev.mysql.com/doc/refman/5.7/en/too-many-c...
    If you get a Too many connections error when you try to connect to the mysqld server, this means that all available connections are in use by other clients.


    "Too many connections" является следствием превышения директивы max connections
    Количество сайтов, серверов или других клиентов базы с этим никак не связано. Хотя помогает быстрее в этот лимит упереться.
    Ответ написан
    2 комментария
  • Как функцию в php переименовать?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    А зачем вам вообще понадобился include_once? Да ещё так часто, что захотелось использовать невнятное имя функции?
    Во вьюхах once не используется, для загрузки классов - autoload, и затем, autoload composer'а вовсе исключили необходимость в написании include. Загрузка объявлений функций? Ну, ок, для функций автозагрузки действительно нет. Почему тога вы не можете использовать короткую функцию, которую привели в вопросе?
    Ответ написан
    2 комментария
  • Разница в индексах mysql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Составной индекс должен быть именно age_country, а не наоборот.

    Как раз наоборот.

    mysql обычно использует подвид btree. У btree поиск левосторонний, т.е. по индексу age & country можно обрабатывать запросы по age. А по индексу country & age искать только age уже нельзя.

    И какова разница между индексом age_country и отдельно двумя индексами для age и для country?

    Вы ищете пользователей некоторой страны с возрастом от 25 лет.
    Перед вами справочники:
    0) пользователи отсортированы по возрасту (в пределах одного возраста - вперемешку) - вам достаточно пролистать до начала 25 лет, а дальше вчитываться в каждого пользователя и искать нужную страну. Справочник вам не поможет в этом. Индекс age
    1) пользователи отсортированы по стране. Вы быстро находите всех из нужной страны, а затем вчитываетесь в каждого пользователя и смотрите возраст. Индекс country
    2) пользователи отсортированы сначала по возрасту, в пределах одного возраста дополнительно отсортированы по стране. Быстренько листаете до 25 лет, в пределах каждого возраста листаете до нужной страны. Как-то не очень удобно? age & country
    3) пользователи отсортированы по стране, пользователи одной страны отсортированы вдобавок по возрасту. Быстренько листаете до нужной страны, быстренько пропускаете всех младше 25 лет - читаете остаток, поглядывая только, что страна не изменилась. country & age

    Какой справочник захотите использовать?
    А если я скажу, что в справочнике помимо сортировки других данных пользователя нет? И чтобы по индексу country уточнить возраст пользователя вам необходимо посмотреть id человека и сходить за остальными данными в картотеку?

    Вы можете взять справочник по стране, переписать все id людей, затем взять справочник по возрасту, и поискать в диапазоне от 25 лет записанные id людей. Потратите много сил на сравнение, не так ли? Вот и mysql умеет index intersect, но операция эта не бесплатная.
    Ответ написан
    Комментировать
  • Как сделать группировку по двум срезам?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    with vertex_cost as (
    select fid_id, sum(vertex_cost) as vertex_cost /*min, max аналогично*/ from vertex group by fid_id
    ),
    edge_cost as (
    select fid_id, sum(edge_cost) as edge_cost /*min, max*/ from edge group by fid_id
    )
    select id, name, vertex_cost, edge_cost
        from fig
        left join vertex_cost vc on fig.id=vc.fig_id
        left join edge_cost ec on fig.id=ec.fig_id

    Если у фигур косты есть всегда - то заменить left join на join. Сейчас фигура будет возвращена всегда, но с NULL.

    Если надо предварительно пофильтровать сами фигуры:
    with figures as (
    select id, name from figures where name like 'foo%'
    ),
    vertex_cost as (
    select fid_id, sum(vertex_cost) as vertex_cost /*min, max*/ from vertex where fig_id in (select id from figures) group by fid_id
    ),
    edge_cost as (
    select fid_id, sum(edge_cost) as edge_cost /*min, max*/ from edge where fig_id in (select id from figures) group by fid_id
    )
    select id, name, vertex_cost, edge_cost
        from figures
        left join vertex_cost vc on figures.id=vc.fig_id
        left join edge_cost ec on figures.id=ec.fig_id
    Ответ написан
    Комментировать
  • Как сравнить две даты?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    $str_date = "2001-01-01 15:20:20";
    $date1 = new \Datetime($str_date);
    $str_date = "2014-11-23 21:30:00";
    $date2 = new \Datetime($str_date);
    
    if ($date1>$date2) {
    //
    }
    Ответ написан
    2 комментария
  • Странные сообщения при выполнении команды update-grub. Цел ли HDD\SSD?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Какие файловые системы-то на разделах в действительности? Или, может там LVM или ещё чего интересно?

    Почти наверняка у вас стоит пакет os-prober. Он вызывается при update-grub и ищет по всем блочным устройствам загрузчики других операционных систем. Для этого дёргает драйвера разных файловых систем, а те, в свою очередь, жалуются в dmesg, что не видят на этом разделе такой файловой системы.
    Ответ написан
  • Как обновить пакет postgresql в debian?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Стоит, и однозначно стоит, если вы с ним работаете. postgresql весьма активно развивается. Один jsonb в 9.4 чего стоит.

    9.1 в репозиториях - это получается у вас wheezy? https://packages.debian.org/search?keywords=postgr...
    Можете поставить просто из backports
    А можете с официального репозитория postgresql: https://www.postgresql.org/download/linux/debian/ Там вижу даже ещё не вышедший 9.6, не говоря уже про 9.5.
    Ответ написан
    Комментировать
  • Как пользоваться SET в Mysql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Суть типа данных set - 64-битная битовая маска со встроенным человечным именованием значений.
    Желаемый фильтр делается условием:
    where FIND_IN_SET('доставка2', delivery_type) or FIND_IN_SET('доставка3', delivery_type)
    Ответ написан
    Комментировать
  • Как подготовить запрос SQL в PHP?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    - $sql = 'SELECT * FROM items WHERE item_name LIKE %:query%';
    + $sql = 'SELECT * FROM items WHERE item_name LIKE :query';
    - $result->bindParam(':query', $query, PDO::PARAM_STR);
    + $result->bindParam(':query', '%'.$query.'%', PDO::PARAM_STR);

    И проверьте свой PDO::ATTR_ERRMODE. Должен быть PDO::ERRMODE_EXCEPTION
    Ответ написан
  • Сайт открывается, но не пингуется. В чем может быть проблема?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    На машине запрещён ICMP трафик весь или конкретно echo-request
    Ответ написан
    4 комментария
  • Как организовать выборку из таблицы MySQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    По разному можно поизвращаться. Например,
    select /**/ from tablename join (
        select id_client, max(next_talk_date) as last_date from tablename where id_client in (/**/) group by id_client
    ) lastdate using(id_client)
    where id_client in (/**/) and next_talk_date >= CURRENT_DATE and (next_talk_date = last_date or next_talk_date > CURRENT_DATE)

    По индексу id_client & next_talk_date должен бегать внятно.

    Или так:
    select /**/ from tablename t
    where id_client in (/**/) and (
        next_talk_date > CURRENT_DATE or not exists (
            select 1 from tablename n 
            where n.id_client = t.id_client and n.next_talk_date > t.next_talk_date
        )
    )
    Ответ написан
  • Как в postgresql на Ubuntu посмотреть содержимое таблицы с "_" в названии?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    С чего вы взяли, что проблема в символе _ в названии? Хотите сказать, что другие такие же синтаксически некорректные запросы работают?

    Откройте любой материал по SQL и сравните с тем, что вы написали.
    Если разницу не видите где-то в промежутке между словом select и именем таблицы - сходите погулять или поспать или ещё чего поделать постороннего.
    Ответ написан
    1 комментарий
  • Почему медленная выборка в партицированных таблицах Postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Покажите explain analyze. Судя по cost в explain, само выполнение запроса корректно.

    Рабочая версия - время жрет сам планировщик. 7к партиций - это очень много. Об этом есть даже заметка в мануале (о чём там только нет заметок, но попробуй их заметь)
    All constraints on all partitions of the master table are examined during constraint exclusion, so large numbers of partitions are likely to increase query planning time considerably. Partitioning using these techniques will work well with up to perhaps a hundred partitions; don't try to use many thousands of partitions.

    https://www.postgresql.org/docs/9.4/static/ddl-par...

    У postgresql партицирование сделано довольно странно и, вообще-то говоря, не предназначенными для этого средствами. Если у вас достаточно большая таблица, чтобы почувствовать бонусы от партицирования, то лучше ограничьтесь парой десятков разделов. Вот ещё статья тематическая есть: https://habrahabr.ru/post/273933/
    Ответ написан
  • Как безопасно дописать в базу?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    update tablename set fieldname = concat('prepend', fieldname) where /**/;
    Ответ написан
    Комментировать
  • Как укоротить запрос mysql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Никогда не смешивайте OR и AND в одном предложении без выделения своих намерений скобками явно.

    WHERE 
            uid IN (1,2,3,4,5) AND reg IN (1,2,3) AND date_last < SUBDATE(CURRENT_DATE, reg)


    Ну или длинно:
    uid IN (1,2,3,4,5) AND (
            (reg=1 AND date_last < NOW() - INTERVAL 1 DAY)
            OR
            (reg=2 AND date_last < NOW() - INTERVAL 2 DAY)
            OR
            (reg=3 AND date_last < NOW() - INTERVAL 3 DAY)
    )
    Ответ написан
    Комментировать
  • Как найти конфиг mysql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    max_connections

    Где mysql ищет свои конфиги:
    mysql --verbose --help
    Вам нужен фрагмент вывода вроде такого:
    Default options are read from the following files in the given order:
    /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
    Ответ написан
  • Кол-во строк затронутых запросом при постоянном соединении MySQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    MySQL и PDO.
    Если вы только не настраивали специально что-то очень странное, то пул постоянных соединений поддерживается не в режиме statement based, а в режиме session based - соединение выдаётся запросившему его процессу монопольно и пока процесс не отпустит соединение сам (например, завершится), это соединение не будет предоставлено никакому другому процессу. Запросы других процессов через это соединение выполняться не будут, даже если соединение простаивает.

    Что делать с умирающими скриптами - а уверены, что что-то надо делать? mysql архитектурно заточен легко и быстро открывать-закрывать соединения. (в отличии от postgresql того же, в котором без стороннего пулера коннектов жизни можно сказать и нет). Зато нет граблей с случайно зависшими транзакциями.

    php.net/manual/en/features.persistent-connections.php
    Persistent connections were designed to have one-to-one mapping to regular connections. That means that you should always be able to replace persistent connections with non-persistent connections, and it won't change the way your script behaves. It may (and probably will) change the efficiency of the script, but not its behavior!
    Ответ написан
  • Как создать табличную функцию в PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Извращенцы какие. Не используйте execute никогда, если без этого можно обойтись.

    https://www.postgresql.org/docs/9.4/static/plpgsql...
    return query select ....

    Можно описать в хранимке, что именно она возвращает:
    CREATE OR REPLACE FUNCTION public.get_full_info_about_passenger(INTEGER)
        RETURNS TABLE(
        id bigint
    )
    AS
    $BODY$
    BEGIN
        RETURN QUERY SELECT p.id FROM public.passengers p;
    END;
    $BODY$
    LANGUAGE plpgsql VOLATILE;

    И просто набор чисел:
    CREATE OR REPLACE FUNCTION public.get_full_info_about_passenger(INTEGER)
        RETURNS setof bigint
    AS
    $BODY$
    BEGIN
        RETURN QUERY SELECT id FROM public.passengers;
    END;
    $BODY$
    LANGUAGE plpgsql VOLATILE;


    Можно возвращать строки таблицы: (удобно, чтобы инкапсулировать какую-то заковыристую логику фильтрации)
    CREATE OR REPLACE FUNCTION public.get_full_info_about_passenger(INTEGER)
        RETURNS setof public.passengers
    AS
    $BODY$
    BEGIN
        RETURN QUERY SELECT * FROM public.passengers;
    END;
    $BODY$
    LANGUAGE plpgsql VOLATILE;


    PS: хинт, который может сэкономить некоторое время: return query не прерывает выполнение кода, после него жизнь есть. И можно использовать в одной хранимке несколько return query, они будут вести себя как union all
    Ответ написан
    4 комментария
  • Как определить допустимый предел размера подключаемого жесткого диска?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Хардварные ограничения: текущий стандарт адресации (2003 года) LBA-48 требует 48-битные абреса блоков, т.е. 2^48 блоков - устройства до 128 ПиБ.

    По софту:
    Старый MBR ограничен в 2,2Тб, есть такое. Размечать диск надо будет в GPT, там 64-битные адреса.
    Debian - это вам не странные windows, а нормальный Linux. Никаких бредовых ограничений на использование GPT нет. Хоть системный, хоть загрузочный, хоть с UEFI, хоть с BIOS - ему всё равно. Будет загружаться и работать как ни в чём не бывало.
    Ответ написан
    Комментировать