Оптимизация Sqlite INSERTION - PullRequest
       1

Оптимизация Sqlite INSERTION

0 голосов
/ 27 августа 2018

Добрый день, ТАК,

Я работаю над программой в PowerShell для управления созданной мной БД SQLite.Я никогда не писал серьезных приложений для использования БД, поэтому сейчас я очень заинтересован в оптимизации моих запросов, поэтому я действительно заинтересован в обратной связи.Моя основная проблема в том, что у меня много данных, которые я хочу включить в отдельную таблицу, которая может уже существовать или не существовать.Похоже, что все мои исследования действительно привели к выполнению INSERT и позволили разузнать его по ограничениям UNIQUE, а не к новой записи, которая выглядела как два сканирования таблицы и неэффективна.Поэтому я решил создать временную таблицу, вставить во временную таблицу FROM таблицу с данными, которые я хочу, и выполнить INSERT, если данные не были во временной таблице.Сегодня вечером я выпиваю несколько напитков и не тестировал код, поэтому, пожалуйста, не критикуйте мелкие опечатки, я просто хочу знать, подходит ли моя методика к ланчу, и если да, пожалуйста, предоставьте лучшее направление.

Моя таблица выглядит так:

CREATE TABLE Processes (
    pk                 INTEGER PRIMARY KEY AUTOINCREMENT
                               UNIQUE,
    hostname           INTEGER NOT NULL,
    artifacttype       INTEGER REFERENCES ArtifactType (pk),
    processname        INTEGER REFERENCES ProcessesName (pk),
    filelocation       INTEGER NOT NULL
                               REFERENCES files (pk),
    pid                INTEGER,
    ppid               INTEGER,
    starttime          INTEGER,
    stoptime           INTEGER,
    token              STRING,
    logonid            INTEGER,
    exitstatus         INTEGER,
    threadcount        INTEGER,
    commandline        INTEGER REFERENCES ProcessesCommandline (pk),
    user               INTEGER REFERENCES users (pk),
    PeakVirtualSize    INTEGER,
    VirtualSize        INTEGER,
    PeakWorkingSetSize INTEGER,
    suspicious         BOOLEAN,
    malicious          BOOLEAN
);

Транзакция:

@"
CREATE TEMPORARY TABLE IF NOT EXISTS Results(pk INTEGER, data TEXT);
INSERT INTO Results(pk, data) VALUES ((SELECT pk, name FROM ProcessesName WHERE name = @processname));
INSERT INTO ProcessesName(name) VALUES (SELECT @processname WHERE NOT EXISTS (SELECT pk FROM Results WHERE data = @processname));
INSERT INTO Results (pk, data) VALUES ((SELECT last_insert_row_id, @processname WHERE NOT EXISTS (SELECT pk FROM Results WHERE data =@processname)));

INSERT INTO Results(pk, data) VALUES ((SELECT pk, file FROM Files WHERE file = @filelocation));
INSERT INTO Files(file) VALUES (SELECT @filelocation WHERE NOT EXISTS (SELECT pk FROM Results WHERE data = @filelocation));
INSERT INTO Results (pk, data) VALUES ((SELECT last_insert_row_id, @filelocation WHERE NOT EXISTS (SELECT pk FROM Results WHERE data =@filelocation)));

INSERT INTO Results(pk, data) VALUES ((SELECT pk, commandline FROM ProcessesCommandline WHERE commandline = @commandline));
INSERT INTO ProcesseCommandline(commandline) VALUES (SELECT @commandline WHERE NOT EXISTS (SELECT pk FROM Results WHERE data = @commandline));
INSERT INTO Results (pk, data) VALUES ((SELECT last_insert_row_id, @filelocation WHERE NOT EXISTS (SELECT pk FROM Results WHERE data =@commandline)));

INSERT INTO Results(pk, data) VALUES ((SELECT pk, SID FROM Users WHERE SID = @SID));
INSERT INTO Users(SID) VALUES (SELECT @SID WHERE NOT EXISTS (SELECT pk FROM Results WHERE data = @filelocation));
INSERT INTO Results (pk, data) VALUES ((SELECT last_insert_row_id, @SID WHERE NOT EXISTS (SELECT pk FROM Results WHERE data =@SID)));



INSERT INTO processes(hostname, artifacttype, processname, filelocation, pid, ppid, starttime, threadcount, commandline, user, PeakVirtualSize, VirtualSize, PeakWorkingSetSize) 
VALUES (@hostname, @artifacttype, (SELECT pk FROM Results WHERE data = @processname), (SELECT pk FROM Results WHERE data @filelocation), @pid, @ppid, @starttime, @threadcount, (SELECT pk FROM Results where data = @commandline), SELECT pk FROM Results WHERE data = @SID, @PeakVirtualSize, @VirtualSize, @PeakWorkingSetSize);
DROP TABLE Results;
"@

* есть несколько внешних ключей, где данные отслеживаются на стороне приложения, поэтому сложные запросы не требуются.

Итак, мой основной вопрос: есть ли более эффективный способ сделать это?

Спасибо, ребята!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...