Задать вопрос
  • Это DDos или ломится вирус?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Это вы DDoS'ите. reply сильно больше входа, плюс если это происходит по 53 порту - классика увеличения мощности UDP флуда через безалаберно настроенные DNS и firewall.

    Перенастройте свой firewall в адекватный режим запрещено всё, что не разрешено явно.
    Ответ написан
    Комментировать
  • Стоит ли делать составные внешние ключи в БД?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    1. внешние ключи должны быть там и те, чтобы гарантировать ссылочную целостность. Должна быть ссылка сочетанием именно двух параметров - значит должна быть ссылка сочетанием пары параметров. Лучше или хуже сюда не применимо. Два разных fk и один составной имеют различное поведение.
    2. для какой именно СУБД? Postgresql следуя стандарту SQL обязывает ссылаться только на уникальное поле. Mysql отступает и в этом вопросе от стандарта и позволяет проверять неуникальное индексированное поле.
    3. см. coding standart конкретного проекта. Обычно никто не обижается против именования: имя таблицы _ имена полей _fk
    4. можно упереться в предел размера индексируемого поля. У postgresql это 1/3 размера странички памяти = 2730 байт по дефолту, у mysql - зависит от кучи факторов.
    Ответ написан
    Комментировать
  • Как правильно сделать SQL запрос?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Включите в sql_mode режим ONLY_FULL_GROUP_BY и тогда, наконец-то, этот странный mysql перестанет разрешать делать странные вещи с группировкой, отчего получаются не менее странные результаты, зависящие от фазы луны .

    www.sql.ru/forum/687908/faq-vyborka-pervoy-posledn...
    Ответ написан
    Комментировать
  • Как прошить HDD Toshiba?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    имеется новый диск

    Ну и в СЦ его.
    Начал выдавать сюрпризы сразу же - как этот расходник можно для чего-то использовать?
    Ответ написан
    Комментировать
  • Проясните работу RAID 1???

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Система обязана продолжать работать.
    Это единственный смысл строить рейд с резервированием данных - продолжать работу при выпадении оговорённого уровнем рейда диска. Больше никакого смысла делать массив с резервированием нет, это ни в коем случае не бекап.

    raid1 на 4 диска, то есть вам нужна ТАКАЯ избыточность хранения, но при этом вы не проверили поведение контроллера? Это странно.
    Ответ написан
  • Что лучше JOIN или использование нескольких таблиц в запросе?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    mysql> explain select test6.i from test6, test9 where test6.i=test9.i;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    |  1 | SIMPLE      | test6 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL                                               |
    |  1 | SIMPLE      | test9 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    25.00 | Using where; Using join buffer (Block Nested Loop) |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    2 rows in set, 1 warning (0,00 sec)
    
    mysql> show warnings;
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Level | Code | Message                                                                                                                                 |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Note  | 1003 | /* select#1 */ select `test`.`test6`.`i` AS `i` from `test`.`test6` join `test`.`test9` where (`test`.`test9`.`i` = `test`.`test6`.`i`) |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0,00 sec)
    
    mysql> explain select test6.i from test6 join test9 on test6.i=test9.i;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    |  1 | SIMPLE      | test6 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL                                               |
    |  1 | SIMPLE      | test9 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    25.00 | Using where; Using join buffer (Block Nested Loop) |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    2 rows in set, 1 warning (0,00 sec)
    
    mysql> show warnings;
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Level | Code | Message                                                                                                                                 |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Note  | 1003 | /* select#1 */ select `test`.`test6`.`i` AS `i` from `test`.`test6` join `test`.`test9` where (`test`.`test9`.`i` = `test`.`test6`.`i`) |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0,00 sec)

    Как можно заметить, оба стиля переписаны в одно и то же представление.

    Имеет смысл использовать join on по соображениям читаемости человеком, т.к. такой join сразу говорит, по каким полям связаны таблицы, а where органично остаётся для фильтрации.
    Плюс, в случае как у вас со связью по паре одноимённых полей можно написать
    SELECT maker, price FROM Product JOIN PC USING(model)

    Что эквивалентно PC.model = Product.model, но короче и позволяет в дальнейшем ссылаться просто на model - парсер уже знает, что значение поля будет идентично и не будет теряться в догадках, хотели вы получить model из PC или из Product
    Ответ написан
    Комментировать
  • Как в БД подставлять старые значения справочников?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Для начала между работником и учебным заведением связь многие-ко-многим.
    Во-вторых, с чего это для новых работников выбираются только новые значения? Можно быть одновременно новым работником и закончить лет *дцать назад именно бывшее тогда учебное заведение. Выбирать можно из всего списка, либо, что лучше, хранить для учебного заведения год открытия и год закрытия (default null) и выбирать подходящие по годам обучения.
    Если сохраняете ещё и даты обучения - то важно учесть, что учебное заведение может быть закрыто в любой момент между поступлением и выпуском студента. Поступил в одно заведение, выпустился из другого - запросто.

    Если нет особых требований к поиску учебных заведений, то достаточно хранить год закрытия (default null) и ссылку на новую форму после реорганизации, если есть (поэтому тоже default null).
    Для вашего примера будет КГПА например с edu_id = 105, reorg_to_id null и КГПУ со своим edu_id, датой закрытия и reorg_to_id = 105
    Ответ написан
    Комментировать
  • Как обработать коды ошибок PDO?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Переключите PDO::ATTR_ERRMODE в единственный адекватный режим PDO::ERRMODE_EXCEPTION.
    Нормальный поток исполнения - вас не заботят ошибки в SQL, раз метод вернул управление, значит он был выполнен успешно.
    Случилась какая-то ошибка - словили исключение. Если для какой-то конкретной ошибки вам нужна своя реакция - то тогда уже выясняете код именно этой ошибки, смотрите в getCode и реагируете на конкретный код ошибки.
    Ответ написан
    1 комментарий
  • Почему не передается строка в массив $_POST?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Что передаваться-то должно?
    frm_flink - это имя формы. Оно не сабмитится.
    А input у вас не имеет имени. Поэтому тоже не отправляется.
    Ну и до комплекта кнопка тоже не имеет имени. Поэтому тело запроса вообще пустое получается. А из пустого тела запроса что-то кроме пустого массива достать очень сложно.

    И включите отображение ошибок. E_NOTICE есть, а вы его не видите.
    Ответ написан
    Комментировать
  • Как реализовать работу баз данных с разными дисками?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Ответ написан
    Комментировать
  • Почему не могу передать данные методом POST?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    $_POST существует всегда. Ну разве только вы сами руками unset сделаете.
    Поэтому проверять на isset($_POST) не имеет смысла.
    Ответ написан
    2 комментария
  • Как преобразовать 1e-06 в 0,000001 в модели Yii?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Числа тождественно равны. Ну, насколько это возможно для by design приблизительного double.

    Если надо пользователю показывать в формате десятичной дроби - то внимание на слово "показывать". Значит это вопрос к вьюхе, а не модели. Штатный number_format, например, можно использовать.
    Ответ написан
    1 комментарий
  • MiniPC с Ubuntu, USB 3.0 работает как USB 2.0, в чем может быть причина?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Тестируя запись поверх NTFS вы тестируете производительность CPU, а не USB или диска.
    Работайте напрямую с блочным устройством - получите скорость блочного устройства.
    dd if=/dev/zero of=/dev/sd? bs=1M count=1024
    (На всякий случай - имеющиеся данные будут перезаписаны)
    Или хотя бы поверх чего-нибудь нативного: ext4, xfs.
    btrfs, помнится, тоже весьма CPU-intensive нагрузка.
    Ответ написан
  • Как можно максимально ускорить выборку с низкой селективностью из таблицы с сотнями миллионов записей?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Какие индексы есть? Структура таблицы?
    explain (analyze, buffers)?

    1. не нужно
    2. см. 1
    3. если вы упираетесь в CPU, а не в диск. Если в диск - сделает только хуже.
    4. сначала выяснить, как ведёт себя имеющаяся табличка. Потом думать. Например, brin по id города. На низкоселективных полях получится внятный компактный индекс.
    5. 200гб вполне себе нормальная база. Даже не астрономически дорого целиком в shared_buffers разместить.
    Ответ написан
  • Как увеличить скорость скрипта работающего с БД?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Возьмите профилировщик и посмотрите, на чём именно теряете время.

    О каком классе СУБД вообще речь?
    Например, если речь о транзакционной РСУБД, строки объёмные, то можно сделать так:
    create temporary table updatetable(guid uuid not null)
    пачками этак по 1000 guid вычитываете guid'ы из источника и записываете в эту временную табличку.
    select guid from updatetable where not exists (select 1 from normaltable where normaltable.guid = updatetable.guid)
    Так получили список guid, которых в целевой БД нет. Сходили в источник за полной версией всех данных этих guid, пачками записали в целевую БД.
    Ответ написан
  • Как можно создать таблицу count-ов?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select QuestionId, 
    sum(case when Value = 5 then 1 else 0 end) as '5'
    sum(case when Value = 4 then 1 else 0 end) as '4'
    sum(case when Value = 3 then 1 else 0 end) as '3'
    from tablename
    group by QuestionId


    Возможно ваша СУБД умеет выполнять операцию pivot.
    Ответ написан
    Комментировать
  • Скопировал таблицу MySQL. Что не так?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Всё так. Что сказали сделать, то СУБД и сделала.

    create table as select никак не связано с копированием структуры таблицы. Создаёт новую таблицу, используя в качестве полей результат запроса и затем копирует результат запроса в качестве данных.

    Копирует структуру таблицы включая индексы запрос CREATE TABLE newtable LIKE oldtable;
    Данные не копирует. Можно скопировать через insert .. select.
    Ответ написан
  • Сильная нагрузка на CPU при выполнении apt-get\aptitude update. Как побороть?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Попробуйте выключить package diff: https://debian-administration.org/article/439/Avoi...

    Это актуально для raspberrypi, где и видел комментарий, что на слабых cpu pdiff лучше выключить. Вам вероятно тоже поможет.
    Ответ написан
  • Как прочитать ответ от сервиса?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    то в файл приходит:

    Значит именно этот мусор вам и отправляют. Вместо нормально кодированного application/x-www-form-urlencoded. Пинайте разработчиков этого сервиса, чтобы исправили этот идиотизм.

    Ну или пишите парсер-костыль.
    Ответ написан
  • Как считается длина ключа в Explain mysql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Давайте считать:
    timestamp - 4 байта
    tinyint по 1 байту
    int - 4 байта
    varchar(255) - где 255 длина в символах. В байтах будет больше. Например, для utf8, потребуется 255*3+2 байта. 767 байт. Для utf8mb4 - 255*4+2
    Итого строка индекса занимает 4 + 767 + 1 + 1 + 4 = 777 байт. Немного не хватает, может быть у вас какие-то из полей могут быть NULL?

    Да, если вы не знали, в индексе и в памяти (например, при сортировке) varchar всегда развёрнут до максимальной длины.
    Если возможные строки у вас фиксированы - используйте enum. 1 или 2 байта места для записи. И уж определённо не 255, если у вас строки в 4-6 символов.
    Ответ написан
    1 комментарий