Добрый день, ТАК,
Я работаю над программой в 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;
"@
* есть несколько внешних ключей, где данные отслеживаются на стороне приложения, поэтому сложные запросы не требуются.
Итак, мой основной вопрос: есть ли более эффективный способ сделать это?
Спасибо, ребята!