Hsqldb переименовывает дубликаты имен элементов с одним и тем же родителем - PullRequest
0 голосов
/ 01 марта 2019

Я написал расширение LibreOffice / OpenOffice, которое разрешает доступ к этим файлам Google Диска.

Для этого я использую базу данных Hsqldb 2.4, файл сценария доступен по адресу: https://github.com/prrvchr/gDriveOOo/blob/master/gDriveOOo/hsqldb/vnd.google-apps.script

API LibreOffice / OpenOffice UNO не обрабатывает дублирующиеся имена файлов (например, в файловой системе), в то время как Google Drive предлагает такую ​​возможность.

Чтобы обойти эту проблему, я создал четыреПредставление ('ChildUri', 'IdentifierUri', 'ItemUri' и 'Uri'), позволяющее мне создать новое имя формы: CONCAT (name, ~, position) для второго и последующего дублона, позиция - их позиция вПредложение GROUP BY ...

CREATE VIEW PUBLIC."ChildUri" ("Id","Name","Parent") AS SELECT "I"."Id","I"."Name","C"."ItemId" FROM PUBLIC."Items" AS "I" JOIN PUBLIC."Children" AS "C" ON "I"."Id"="C"."ChildId"  WHERE "I"."Trashed"=FALSE

CREATE VIEW PUBLIC."IdentifierUri" ("Idx","Name","Parent") AS SELECT ARRAY_AGG("I"."Id" ORDER BY "I"."DateCreated","I"."Id"),"I"."Name","C"."Parent" FROM PUBLIC."Items" AS "I" JOIN PUBLIC."ChildUri" AS "C" ON "I"."Id"="C"."Id" GROUP BY "I"."Name","C"."Parent"

CREATE VIEW PUBLIC."ItemUri" ("Id","Name","Length","Position","Parent") AS SELECT "C"."Id","I"."Name",CARDINALITY("I"."Idx"),POSITION_ARRAY("C"."Id" IN "I"."Idx"),"I"."Parent" FROM PUBLIC."ChildUri" AS "C" JOIN PUBLIC."IdentifierUri" AS "I" ON "C"."Name"="I"."Name" AND "C"."Parent"="I"."Parent"

CREATE VIEW PUBLIC."Uri" ("Id","Name","Uri","Parent") AS SELECT "I"."Id","I"."Name",CASEWHEN("I"."Position"=1,"I"."Name",INSERT("I"."Name", LENGTH("I"."Name") - POSITION('.' IN REVERSE("I"."Name")) + 1,0,CONCAT('~',"I"."Position"))),"I"."Parent" FROM PUBLIC."ItemUri" AS "I"

Работает хорошо, но при вызове процедуры 'selectChild' не хватает скорости, выполнение занимает 10 секунд, тогда как раньше - всего несколько секунд.

CREATE PROCEDURE PUBLIC."selectChild"(IN USERID VARCHAR(100),IN ITEMID VARCHAR(100),IN URL VARCHAR(250),IN MODE SMALLINT,OUT ROWCOUNT SMALLINT) SPECIFIC "selectChild_1" LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA NEW SAVEPOINT LEVEL DYNAMIC RESULT SETS 1 BEGIN ATOMIC DECLARE TMPCOUNT SMALLINT DEFAULT 0;DECLARE RESULT CURSOR WITH RETURN FOR SELECT "Title","Size","DateModified","DateCreated","IsFolder",CASEWHEN("IsFolder",CONCAT(URL,'/',"Id"),CONCAT(URL,'/',"Uri"))"TargetURL",FALSE "IsHidden",FALSE "IsVolume",FALSE "IsRemote",FALSE "IsRemoveable",FALSE "IsFloppy",FALSE "IsCompactDisc" FROM PUBLIC."Child" WHERE "UserId"=USERID AND "Parent"=ITEMID AND("IsFolder" OR "Loaded">=MODE)FOR READ ONLY;CALL "countChild"(USERID,ITEMID,MODE,TMPCOUNT);SET ROWCOUNT=TMPCOUNT;OPEN RESULT;END

Я признаю, что это превосходит мои навыки, и обращается к вам за помощью.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Фредт, какое удовольствие, что вы отвечаете ... Не могу найти лучшего ...

Я признаю, что управление индексами должно быть неутешительным.

Поэтому я изменяю базовые таблицы (Пользователи, Идентификаторы, Возможности, Дети), чтобы добавить УНИКАЛЬНОЕ ОГРАНИЧЕНИЕ и ИНОСТРАННОЕ КЛЮЧЕВОЕ ОГРАНИЧЕНИЕ.Я перепутал UNIQUE INDEX и UNIQUE CONSTRAINT ...

CREATE CACHED TABLE PUBLIC."Users"("Id" VARCHAR(100) NOT NULL PRIMARY KEY,"UserName" VARCHAR(100) NOT NULL,"DisplayName" VARCHAR(100),"RootId" VARCHAR(100) NOT NULL,"TimeStamp" TIMESTAMP DEFAULT CURRENT_TIMESTAMP(3) NOT NULL,CONSTRAINT "UniqueUserName" UNIQUE ("UserName"))
CREATE CACHED TABLE PUBLIC."Identifiers"("Id" VARCHAR(100) NOT NULL PRIMARY KEY,"UserId" VARCHAR(100) NOT NULL,"TimeStamp" TIMESTAMP DEFAULT CURRENT_TIMESTAMP(3) NOT NULL,CONSTRAINT "ForeignIdentifiersUsers" FOREIGN KEY ("UserId") REFERENCES "Users"("Id"))
CREATE CACHED TABLE PUBLIC."Children"("ChildId" VARCHAR(100) NOT NULL,"ItemId" VARCHAR(100) NOT NULL,"TimeStamp" TIMESTAMP DEFAULT CURRENT_TIMESTAMP(3) NOT NULL,CONSTRAINT "UniqueChildItem" UNIQUE ("ChildId", "ItemId"),CONSTRAINT "ForeignChildrenItems" FOREIGN KEY ("ItemId") REFERENCES "Items"("Id"))
CREATE CACHED TABLE PUBLIC."Capabilities"("UserId" VARCHAR(100) NOT NULL,"ItemId" VARCHAR(100) NOT NULL,"CanAddChild" BOOLEAN DEFAULT FALSE NOT NULL,"CanRename" BOOLEAN DEFAULT FALSE NOT NULL,"IsReadOnly" BOOLEAN DEFAULT FALSE NOT NULL,"IsVersionable" BOOLEAN DEFAULT FALSE NOT NULL,"Loaded" SMALLINT DEFAULT 0 NOT NULL,"SyncMode" SMALLINT DEFAULT 0 NOT NULL,"TimeStamp" TIMESTAMP DEFAULT CURRENT_TIMESTAMP(3) NOT NULL,CONSTRAINT "ForeignCapabilitiesUsers" FOREIGN KEY ("UserId") REFERENCES "Users"("Id"),CONSTRAINT "ForeignCapabilitiesItems" FOREIGN KEY ("ItemId") REFERENCES "Items"("Id"))

И я также добавил INDEX для элемента VIEW, Child и VIEW, что позволяет мне создать новое имя (ChildUri, IdentifierUri, ItemUri и Uri).

Я не знал, что мы можем поместить INDEX в VIEW ...

CREATE INDEX "ItemIndex" ON "Item"("UserId", "Id")
CREATE INDEX "ChildUriIndex" ON "ChildUri"("Id","Parent")
CREATE INDEX "IdentifierUriIndex" ON "IdentifierUri"("Idx","Parent")
CREATE INDEX "ItemUriIndex" ON "ItemUri"("Id","Parent")
CREATE INDEX "UriIndex" ON "Uri"("Id","Parent")
CREATE INDEX "ChildIndex" ON "Child"("UserId", "Parent")

Я сохранил индексы "TrashedIndex" и "MimeTypeIndex" в таблице "Предметы", эти столбцы появляются вПредложения WHERE

CREATE INDEX "TrashedIndex" ON PUBLIC."Items"("Trashed")
CREATE INDEX "MimeTypeIndex" ON PUBLIC."Items"("MimeType")

Запрос "selectChild" теперь выполняется за несколько секунд, но я не уверен в своих индексах ... Я думаю, что у меня есть избыточность или отсутствует, или я оченьповезло ...

Еще раз спасибо.

Редактировать: После нескольких тестов производительности, очевидно, только CONSTRAINT UNIQUE и FOREIGN KEY на уровне базовых таблиц улучшают производительность, INDEX на VIEWне улучшает запрос или незаметно без инструмента тестирования производительности.

0 голосов
/ 03 марта 2019

Вам нужен индекс для улучшения скорости запроса SELECT к таблице.SELECT в процедуре нужен индекс, такой как следующий, если это еще не FOREIGN KEY

CREATE INDEX "ChildIndex" ON "Child"("Parent", "UserId")
...