Задать вопрос
  • Жизнеспособна ли задумка и реализация "динамического" rpc?

    @Miron11
    Пишу sql 20 лет. Срок :)
    Ответ написан
    Комментировать
  • Почему postgresql выбирает неоптимальный план выполнения для простого JOIN?

    @Miron11
    Пишу sql 20 лет. Срок :)
    Здравствуйте Уважаемый che_aa,

    Вот SQL, который указывает, что кроме UNIQUE CONSTRAINT необходимо создать ещё и UNIQUE INDEX на тех же полях. Без UNIQUE INDEX план выполнения запроса действительно, не оптимален.

    Я не уверен в причине этого поведения, вот цитата из документации продукта:
    Adding a unique constraint will automatically create a unique B-tree index on the column or group of columns listed in the constraint. A uniqueness restriction covering only some rows cannot be written as a unique constraint, but it is possible to enforce such a restriction by creating a unique partial index.


    В дополнение, в определение индекса добавлено поле unix_time_check в части INCLUDE.

    Если Вы будете выполнять скрипт, будьте внимательны, чтобы провести эксперимент в отдельной базе данных, специально созданной для эксперимента. Я постарался оградить запросы так, чтобы не повредить существующие данные и объекты, но не могу гарантировать, так что будьте внимательны.

    -- DROP TABLE IF EXISTS public.friends_info;
    
    CREATE TABLE IF NOT EXISTS public.friends_info (
      user_id         bigint
    , friend_id       bigint
    , unix_time_check bigint
    );
    
    ALTER TABLE IF EXISTS public.friends_info
    ADD CONSTRAINT friends_info_user_id_friend_id_key UNIQUE (user_id, friend_id);
    CREATE INDEX IF NOT EXISTS ix_friends_friend_id ON public.friends_info (friend_id);
    CREATE INDEX IF NOT EXISTS ix_friends_user_id ON public.friends_info (user_id);
    
    WITH EncodedData AS (
    SELECT gs.rownum
         , gen_random_bytes(4) AS RandBytes
    FROM generate_series(1,1000000) gs (rownum)
        WHERE NOT EXISTS (
           SELECT 1
           FROM public.friends_info
           LIMIT 1
      )
    ), DecodedData AS (
        SELECT rownum
    	      ,(get_byte(RandBytes, 0)::bigint + (get_byte(RandBytes, 1)::bigint << 8) + (get_byte(RandBytes, 2)::bigint << 16) + (get_byte(RandBytes, 3)::bigint << 24))::bigint
    	            AS RandBigInt
    	FROM EncodedData
    ), PreparedData AS (
     SELECT rownum AS user_id
          , (RandBigInt % 1000000) + 1 AS friend_id
          , RandBigInt AS unix_time_check
     FROM DecodedData
    )
    INSERT INTO public.friends_info (
      user_id         
    , friend_id       
    , unix_time_check 
    ) SELECT 
      user_id         
    , friend_id       
    , unix_time_check 
    FROM PreparedData;
    
    -- EXPLAIN (ANALYZE,BUFFERS)
    SELECT * 
    FROM friends_info 
    LEFT JOIN friends_info i ON friends_info.friend_id = i.user_id 
    WHERE friends_info.user_id = 1;
    
    CREATE UNIQUE INDEX IF NOT EXISTS friends_info_user_id_friend_id_key2
    ON public.friends_info (user_id, friend_id) INCLUDE (unix_time_check);
    
    -- EXPLAIN (ANALYZE,BUFFERS)
    SELECT * 
    FROM friends_info 
    LEFT JOIN friends_info i ON friends_info.friend_id = i.user_id 
    WHERE friends_info.user_id = 1;
    
    -- EXPLAIN (ANALYZE,BUFFERS)
    SELECT *
    FROM friends_info 
    LEFT JOIN friends_info i
    ON friends_info.friend_id = i.user_id 
    WHERE friends_info.friend_id=592737;


    Вообще, есть интересные возможности решить запрос такого типа используя следующее GraphDB расширение СУБД Postgres. Это было бы неплохим испытанием на прочность. Если Вы интересуетесь, оставайтесь на связи.
    Ответ написан
  • Как получать значения только из одной таблицы при join?

    @Miron11
    Пишу sql 20 лет. Срок :)
    У Вас 2 варианта,
    1. использовать отфильтрованный список servers_world
    2 использовать значение typew в контексте выборки ( так же с фильтром )
    1-й подход может, в свою очередь, иметь два подхода, в зависимости от того, какие фишки SQL поддерживает Ваша СУБД.

    1. C(ommon) T(able) E(xpression):

    WITH filtered_servers_world AS (
    SELECT DISTINCT cat_id, typew
    FROM filtered_servers_world
    )
    SELECT `servers_texts`.*
    , `filtered_servers_world`.`typew`
    FROM `servers_texts`
    LEFT JOIN `filtered_servers_world` ON `servers_texts`.`id` = `filtered_servers_world`.`cat_id`
    WHERE `servers_texts`.`premod` = 1
    AND `servers_texts`.`cat_id` = ' 10'
    AND `filtered_servers_world`.`typew` = ' 1'
    ORDER BY `vote` DESC, `servers_texts`.`id` DESC

    2. Sub-Query с алиасом:
    SELECT `servers_texts`.*
    , `filtered_servers_world`.`typew`
    FROM `servers_texts`
    LEFT JOIN (SELECT DISTINCT cat_id
    , typew
    FROM `servers_world`) AS `filtered_servers_world`
    ON `servers_texts`.`id` = `filtered_servers_world`.`cat_id`
    WHERE `servers_texts`.`premod` = 1
    AND `servers_texts`.`cat_id` = ' 10'
    AND `filtered_servers_world`.`typew` = ' 1'
    ORDER BY `vote` DESC, `servers_texts`.`id` DESC

    3. inline используя контекст выборки данных, менее эффективно, но иногда работает лучше подходов 1, 2 в частности, когда СУБД распределенная, поскольку уменьшает количество раз данные копируются между порциями данных разделенных на разные машины

    SELECT *
    FROM (
    SELECT `servers_texts`.*
    , (SELECT MAX(`servers_world`.`typew`) FROM `servers_world` WHERE `servers_world`.`cat_id` = `servers_texts` .`cat_id`) AS `typew`
    FROM `servers_texts`
    WHERE `servers_texts`.`premod` = 1
    AND `servers_texts`.`cat_id` = ' 10'
    ) AS `dt`
    WHERE `typew` = '1'
    AND `premod` = 1
    AND `cat_id` = ' 10'
    ORDER BY `vote` DESC, `servers_texts`.`id` DESC

    4 lateral join или outer apply

    SELECT `servers_texts`.*
    , `filtered_servers_world`.`typew`
    FROM `servers_texts`
    LEFT JOIN LATERAL (
    SELECT `typew`
    FROM `servers_world`
    WHERE `servers_world`.`cat_id` = `servers_texts`.`cat_id`
    ORDER BY `typew` DESC
    LIMIT 1
    ) `filtered_servers_world` ON TRUE
    WHERE `servers_texts`.`premod` = 1
    AND `servers_texts`.`cat_id` = ' 10'
    AND `filtered_servers_world`.`typew` = ' 1'
    ORDER BY `vote` DESC, `servers_texts`.`id` DESC

    Заметьте, я поменял поле на котором servers_texts и servers_world установили родство. В Вашем оригинальном запросе поле servers_texts использует id в JOIN выражении, но глядя на поля предложенные в таблицах cat_id выглядит, как поле, которое больше подходит.
    Возможно я не прав, пожалуйста проверьте.
    В крайнем случае, пожалуйста верните оригинальное поле.

    -- Удачи
    Ответ написан
  • Как определить, в какой ситуации оптимальнее использовать подзапросы, а не соединения?

    @Miron11
    Пишу sql 20 лет. Срок :)
    1. подзапросы типа exists лучше для
    • распределенных баз
    • минимизации ресурса памяти и уменьшения или изъятия параллелизма

    2. join лучше для
    • локальной базы
    • концентрации ресурсов на выполнении запроса

    3. outer apply / lateral join позволяют использовать преимущества correlated subqueries и выбирать данные, существенные преимущества
    • минимизируются изменения логики выборки данных
    • часто удается вовлечь индексы в выборку, не обращая внимание на распределение данных внутри домена, когда рост количества таблиц вовлеченных в inner / outer join с различными срезами данных, ведет к отказу оптимизатора запросов использовать индексы
    Ответ написан
    Комментировать
  • Ошибка #1064. Как объявлять переменные в mysql 8.0?

    @Miron11
    Пишу sql 20 лет. Срок :)
    пример из книги, поищите ее, это классика
    MySQL Stored Procedure Programming
    By Steven Feuerstein, Guy Harrison
    ...............................................
    Publisher: O'Reilly
    Pub Date: March 2006
    Print ISBN-10: 0-596-10089-2
    Print ISBN-13: 978-0-59-610089-6
    Pages: 636

    -------------------------------------------
    CREATE TRIGGER account_balance_au
     AFTER UPDATE ON account_balance FOR EACH ROW
    BEGIN
      DECLARE dummy INT;
    
      IF NEW.balance<0 THEN
         SET NEW.balance=NULL;
      END IF;
    
    END
    $$
    Ответ написан
    Комментировать
  • Как записать значение в файл и зашифровать его на языке C?

    @Miron11
    Пишу sql 20 лет. Срок :)
    тут дело не в си или не си, шифрование данных предполагает наличие не связанного с записью файла канала передачи данных
    по-простому люди обходились без компьютеров, чтобы обеспечить те же возможности много-много лет, был гонец
    e91220a637c9320f74982.jpg
    который был наделен царским вензелем, и все, чо он нес был пароль3a8faaf3192a76791a346ab9021fb6b4.jpeg
    прежде, чем что-то шифровать Вам придется понять как Вы перенесете пользователям пароль
    для этого вам надо познакомиться с различными схемами шифрования, и по крайней мере одну из них признать достойной доверия
    потому, что главной изюминкой различных схем шифрования является именно механизм, устройства контроля и подтверждения доверия шага передачи пароля назначенному получателю
    такой вот глубокой проработки без вам больше подойдет записать те самые 30 в файл, и сделать у себя резервную копию этого файла
    слать этот файл кому необходимо
    а когда файл пришлют назад, и там 100500 позвонить пользователю по телефону и спросить., что долно быть на самом деле.
    в данном случае паролем является голос собеседника, за миллионы лет избирательность этого инструмента подтверждения личности собеседника достигла очень высокого совершенства, более того, по интонациям голоса и некоторым жизненным социальным приемам мы, люди, без исключения, наделены способностями выяснить насколько искренен наш собеседник.
    ну а если Вы все таки решитесь создать код с цепочкой инструкций кодирующих пошаговое выполнение столь не простой процедуры, то только тогда придет время си или не си
    Ответ написан
  • Выбор базы данных для быстрой записи меняющихся данных?

    @Miron11
    Пишу sql 20 лет. Срок :)
    и что, вы взяли коэффициент к в 0 часов, ав 0 часов 1'' коэффициент k поменялся k`, и кто-то тем старым коэффициентом k воспользовался.
    Вы серьезно ок забыть, какой он был?
    Наверное даже во время запроса по списку, часть коэффициентов изменится, по мере считывания, при том, что все, как задумано,но по-честному Вам бы наверное хотелось список "к" в 0 часов список в 0 часов + 1 версия + 2 ... n версия.
    Учитывая 300 значений/3 секунды по 32 бита на каждый получаем 1,2МБ в час. В принципе копейки для MySQL
    Редиску можно встроить для текущего слепка, если хочется немедленный ответ из буфера.
    Ответ написан
    Комментировать
  • Книги, курсы по архитектуре приложений?

    @Miron11
    Пишу sql 20 лет. Срок :)
    Один мудрый индийский рекрутер поделился со мной аббревиатурой TOGAF, а всё остальное я нашел сам.
    Надеюсь Вам тоже поможет.
    Не самое важное, на мой скромный взгляд вопрос тянет на уровень сложности средний.
    Ответ написан
    1 комментарий
  • Почему у меня под конец в листе rows начинают хранится одни и те же значения?

    @Miron11
    Пишу sql 20 лет. Срок :)
    Есть два подхода, чтобы справиться, перенести линию кода
    string[] row = new string[rd.FieldCount];
    сюда
    while (rd.Read())
    {

    сразу после фигурной скобки, или изменить линию кода
    rows.Add(row.Clone());
    Причина, array это "reference type", познакомиться с описание reference type можно здесь, ключ к пониманию следующий абзац:
    With reference types, two variables can reference the same object; therefore, operations on one variable can affect the object referenced by the other variable.
    . Точнее, что такое reference type потребует отладчик и работу с MSIL. Вот как описывает reference type MSIL standard:

    I.8.2.1 Value types and reference types
    There are two kinds of types: value types and reference types.
    [...]
     Reference types –A value described by a reference type denotes the location of another
    value.
    По этой причине, не смотря на то, что вы трижды сместили строку в DataReader, запись каждый раз производилась в один и тот же блок данных, переписывая его, а три записи в неизвестной лист были обращены к одному и тому же блоку.
    Ответ написан
    Комментировать
  • Как сделать min() по join таблице в построителе запросов?

    @Miron11
    Пишу sql 20 лет. Срок :)
    SQL
    ---
    select department.*
             , coalesce(dptSlr.minSalary, 0.00) as minSalary
    FROM `department` 
    left outer join 
    (SELECT employee.departmentId, MIN(employee.salary ) AS minSalary 
        FROM employee
        GROUP BY employee.departmentId) dptSlr
    on department.id = dptSlr.departmentId;
    Ответ написан
    Комментировать
  • Как в Selenium Java получить в элементах интрересующие атрибуты (метод findElements()), а потом нажать, в любой элемент, который подходит?

    @Miron11
    Пишу sql 20 лет. Срок :)
    I think you just dialed a bit too far with
    time = driver.findElements(By.xpath(TIME_CHECK)).iterator().next().getAttribute("class");
    with . approach.
    Usually what we do, if you do want to use this convoluted one - liner ( in c# for example ) is call ( this is a pseudocode )
    .iterator().firstOrDefault()
    and that way we get the value.
    In Java I think there are methods such as tail(x) / head(x) / first(x) invoked on the collection ( here it is probably the return of findElement()) which will return an array from which you can take [0] element ( which may fail to null exception )
    The Java pattern is to first check for null and than perform value access.
    So, you can see that while one - liner can look nice, it would require a bit higher effort at understanding internals.
    Simpler pattern is to scroll using iterator
    while(driver.findElements(By.xpath(TIME_CHECK)).iterator().next()) {
    x = driver.findElements(By.xpath(TIME_CHECK)).iterator().current() / item()
    myValue = x.method / property
    break or something else
    }
    This takes a few more lines, but is easy to follow and debug. Personally, I use both approaches, depending on context, but when in doubt the easier one.
    ---
    I was under impression this is where error occurs ( please correct me if I am wrong ).
    If my understanding is correct, the rest looks like somewhat working approach.
    Except it's probably an pattern specific to Selenium.
    In an application, if I wanted to be able to perform some action on items, found in the cycle of the iterator above, while cycle is still running, I'd use a
    yeld
    pattern, and organize concurrency by means of function invoked in yeld block with item / value passed as parameter. Give me a moment to find an example.
    Darn it, yeld is c# pattern, ported to java only as of release 13.
    So, just save the value to list in the cycle and run over it once iterator is done.
    It shouldn't take too long.
    Ответ написан
    Комментировать
  • Как рандомизировать адреса функций в ELF-файле?

    @Miron11
    Пишу sql 20 лет. Срок :)
    смещение адреса функций можно отрегулировать после сборки, есть всякие редакторы для выполнимых
    случайные адреса функций внутри блока, это ответственность так называемых обфускаторов, как правило это отдельные утилиты встроенные в пакеты сборки, возможно GCC имеет встроенный тогда да, может быть флаг, по которому функции будут иметь случайные адреса
    поскольку конкретный флаг легко ищется в яндексе не сложным запросом, будьте так добры, поделитесь в комментарии, когда найдете :)
    Ответ написан
    Комментировать
  • Как ссылаться на другое поле в yaml файле?

    @Miron11
    Пишу sql 20 лет. Срок :)
    Does this help?
    Ответ написан
    Комментировать
  • Русский open-source, есть ли он?

    @Miron11
    Пишу sql 20 лет. Срок :)
    Сделай свой?
    Для начала не надо даже создавать продукт, в привычном понимании слова. Сделайте, например, словарь выражений для выборки данных. Презентуйте здесь с просьбой о критике.
    Мы пока говорить с машинами по-русски не умеем, а должны.
    Я сам пробовал, но я музыкант. У меня на каждый полутон по 200 приемов, как его разукрасить. Здесь не нужно быть старшим. Достаточно быть просто технически грамотным.
    Ответ написан
    Комментировать
  • Как оформить все свойства книг не через константы?

    @Miron11
    Пишу sql 20 лет. Срок :)
    Try Delta Lake Connectors:
    This is a path to use dataframe ( with data stored in something like parquet ).
    This allows to store / maintain data in a simple and portable data store.
    You can keep it on local machine, or push to cloud.
    Access using above or any other technology, capable of understanding parquet.
    In its simplest direct application DSR/DSW provides for
    .filter
    and other expressive methods, good for business and pleasure to code.
    And you won't have to struggle with nested maps and such, which will be dead - end regardless, once number of books is larger than, say, 500, or you need to produce monthly report from bot activities, whichever comes first :)
    Ответ написан
    Комментировать
  • Почему SQL запрос неправильный?

    @Miron11
    Пишу sql 20 лет. Срок :)
    select good, amount as sum from Payments
    order by sum desc;
    Ответ написан
    Комментировать
  • Как в Selenium Java обойти UnhandledAlertException?

    @Miron11
    Пишу sql 20 лет. Срок :)
    catch "Throwable t" ( if it exists in this variant of Java ).
    The downside, if it is intercepted, it may, potentially, intercept everything else.
    So, you may want to check for specific error message, before letting it be ignored.
    So that you do not miss something interesting.
    Ответ написан
  • Есть ли разница в экране realme 9 pro+ и samsung s21+?

    @Miron11
    Пишу sql 20 лет. Срок :)
    у 21-го стекло экрана хрупкое, разбивается, если уронить ( одна из рекламных фишек, якобы стекло устойчиво к удару )
    довольно прожорливый
    чем удобен, заправляется без провода,
    разъём хрупкий, это помогает, если беречь, сохранить устройство работающим
    еще у него антенны лучше защищены от помех, чем у устройств попроще
    если вам важно для дела, или удовольствия, иметь возможность вести переговоры независимо от внешних помех, то более дорогой телефон стоит затрат, а так, если не проблема выйти на улицу побеседовать, когда дома искрит мотор стиралки, то смысла в дорогом телефоне абсолютно нет
    если есть часы от самсунг, то у 21го есть дополнительные фишки, которые его выделяют в класс выше. Например пакет по для измерения давления. Алгоритм работает с оговорками и пока только Эппл может похвастать лицензией государственного департамента еды и лекарств США, но так, не совсем легально, но очень удобно, есть фишка. И в 21м году она была реализована только на 21м изделии фирмы. Возможно в 22м все устройства фирмы интегрируются с этими возможностями? - не знаю
    прошу прощения, если не ответил на вопрос :)
    Ответ написан
  • MSSQL and mysql в чем отличие?

    @Miron11
    Пишу sql 20 лет. Срок :)
    Не удалось выполнить действие "Создать" для следующего объекта: "Пользователь", "sa".
    ---
    И чем вас это обеспокоило? Пользователь sa уже создан, ошибка в данном случае вполне может быть проигнорирована.
    ---
    Есть наверное различные пакеты для трансляции MSSQL Server -> MySQL. запрос в Яндексе "migration from sql server to my sql" третьей линией привел сюда.
    По опыту, на поверхности, многое действительно поддается трансляции, но процедуры и функции, нет.
    Но чуть от поверхности, MySQL уступает в плане отладки и выявления ошибок. А проблемы с правами пользователей мало отличаются. Попытка создать пользователя, который уже есть приведет к той же ошибке и в MySQL.
    Есть конечно возможности отладить код создающий объекты, применяя "IF NOT EXIST" выражение. Профессионалы используют два подхода для кода создающего объекты.
    Подход №1 - фирменный подход специалистов, проверять существование объекта, прежде чем его создать.
    Людям свойственно это делать, чтобы обеспечить наименьшие трения с чтением и пониманием ошибок. В этом случае детальное чтение ошибок необходимо для выявления дефектов.
    Такой код удобен тем, что его можно повторять снова и снова, результат будет всегда один и тот же, а ошибки будут выданы только в случае дефекта, или записи будут чистыми.
    Подход №2 - обычно используют создатели по, которое пишет скрипт "создать такой-то объект", с оглядкой на профессионального пользователя, который ( как считают создатели по ) достаточно знаком и с синтаксисом, и с важностью тех или иных сообщений, и сможет прочитать "с листа" записи машины, и справиться с выдачей решения "все хорошо" или "что-то сломалось" благодаря накопленным знаниям.
    У меня сложилось впечатление, что Вы работаете с кодом, созданным в подходе №2. Возможно если Вы прибавите детали, и опишете что Вы делаете, отвечающим на вопрос будет проще справиться с ответом.
    Всего хорошего
    Ответ написан
    2 комментария
  • Как в Elasticsearch проверить, что массив содержит определенное количество значений?

    @Miron11
    Пишу sql 20 лет. Срок :)
    Did you try this approach, adjusting to field names.
    Passed test on ES 8.2.2:
    {
      "aggs" : {
        "@timestamp": {
          "terms" : { "field" : "@timestamp"},   
    
      "aggs": {
        "shift_count": {
          "value_count": { "field": "shifts.id" }
        },
        "shift_count_filter": {
          "bucket_selector": {
            "buckets_path": {
              "shiftCount": "shift_count"
            },
            "script": "params.shiftCount > 1"
          }
        }
      }}}
    }

    I am still searching how to apply filter over aggregate using "filtered" query approach, something like
    select * from ( select count(*) as count_of_items, item_name from item_collection group by item_name ) as inner_query 
    where count_of_items > 1

    as this approach, using aggregates feels more like a workaround ( thought robust to use in production ).
    If you come over something interesting, please post here.
    ---
    I don't know the reason as to why, since I just installed elasticsearch to investigate your question, the approach with measuring array using property values and function size() didn't work.
    Based on all I have learned so far, the dynamic property, currently set to false on the shifts field may need to be modified to false, to enable dynamic scripting.
    For aggregate approach above to work over nested field with text sub - field, the field may need to be applied with "fielddata" attribute set to true, by default if is false on such fields. It could be this is a new behavior since version 8.2.2. Here is error message I was getting in some experiments
    "type" : "illegal_argument_exception",
    "reason" : "Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [...] in order to load field data by uninverting the inverted index. Note that this can use significant memory."
    here is script to apply fielddata attribute:
    shifts: {
      type: 'object',
      dynamic: false,
      fielddata: true,
      properties: { id: { type: 'keyword' }, { type: 'keyword' } },
    }

    -- cheers
    Ответ написан
    Комментировать