Я очень сильно застрял при попытке завершить выполнение запроса SQLite, и в настоящее время у меня нет ярких идей. Кроме того, я новичок в области написания SQL-запросов, и я все еще изучаю концепцию индексов базы данных и т. Д.
Я мигрирую приложение из Access в SQLite, и запрос занимает около 1 минуты для запуска в Access. Запрос приведен ниже (также я не могу перенести обратно в Access из SQLite):
SELECT pgDescription, oSimulationID, oSimRunID, ipParticipantID, oPeriod,
Some_Aggregation_Function(dpVal) FROM
(
SELECT pgDescription, oSimulationID, oSimRunID, ipParticipantID, oPeriod, dpVal,
ptPropertyTypeName FROM tmpPartArgs INNER JOIN
(
SELECT pgDescription, oSimulationID, oSimRunID, ipParticipantID,
oPeriod, dpVal, dpParticipantID, ptPropertyTypeName FROM
(
SELECT o.SimulationID AS oSimulationID, o.SimRunID AS oSimRunID,
o.Period AS oPeriod, dpVal, dpParticipantID, ptPropertyTypeName FROM Occurrence AS o INNER JOIN
(
SELECT * FROM
(
SELECT dp.Val AS dpVal, dp.SimulationID AS
dpSimulationID, dp.SimRunID AS dpSimRunID,dp.ParticipantID AS dpParticipantID,
dp.OccurrenceID AS dpOccurrenceID, pt.PropertyTypeName AS ptPropertyTypeName FROM
PropertyType AS pt INNER JOIN DynamicProperty AS dp ON pt.PropertyTypeID = dp.PropertyTypeID
) AS query0 WHERE query0.ptPropertyTypeName = \"" + args.propertyName + "\"
) AS query1 ON (o.SimulationID = query1.dpSimulationID)
AND (o.SimRunID = query1.dpSimRunID) AND (o.OccurrenceID = query1.dpOccurrenceID)
) AS query2 INNER JOIN
(
SELECT pg.Description AS pgDescription, ip.ParticipantID AS
ipParticipantID FROM ParticipantGroup AS pg INNER JOIN InitialParticipant AS ip ON pg.ParticipantGroupID = ip.ParticipantGroupID
) AS query3 ON query2.dpParticipantID = query3.ipParticipantID
) AS query4 ON tmpPartArgs.participantID = query4.dpParticipantID
) AS query5 INNER JOIN tmpSimArgs ON (query5.oSimRunID = tmpSimArgs.SimRunID) AND (query5.oSimulationID = tmpSimArgs.SimulationID)
GROUP BY query5.oSimulationID, query5.oSimRunID, query5.oPeriod,
query5.ipParticipantID, query5.pgDescription ORDER BY query5.oPeriod ASC;
Приведенный выше запрос выполняется в Access примерно за минуту. Выходные данные query1, query2, query3, query4 и query5 составляют около 1 200 000 записей. И в SQLite это не заканчивает выполнение, я не знаю почему? Я не понимаю, почему приведенный выше запрос занимает минуту для выполнения в Access и не завершает выполнение в SQLite. Самым запутанным в вышеуказанном запросе является подзапрос no. 5, т. Е.
SELECT pgDescription, oSimulationID, oSimRunID, ipParticipantID, oPeriod, dpVal,
ptPropertyTypeName FROM tmpPartArgs INNER JOIN
(
SELECT pgDescription, oSimulationID, oSimRunID, ipParticipantID,
oPeriod, dpVal, dpParticipantID, ptPropertyTypeName FROM
(
SELECT o.SimulationID AS oSimulationID, o.SimRunID AS oSimRunID,
o.Period AS oPeriod, dpVal, dpParticipantID, ptPropertyTypeName FROM Occurrence AS o INNER JOIN
(
SELECT * FROM
(
SELECT dp.Val AS dpVal, dp.SimulationID AS
dpSimulationID, dp.SimRunID AS dpSimRunID,dp.ParticipantID AS dpParticipantID,
dp.OccurrenceID AS dpOccurrenceID, pt.PropertyTypeName AS ptPropertyTypeName FROM
PropertyType AS pt INNER JOIN DynamicProperty AS dp ON pt.PropertyTypeID = dp.PropertyTypeID
) AS query0 WHERE query0.ptPropertyTypeName = \"" + args.propertyName + "\"
) AS query1 ON (o.SimulationID = query1.dpSimulationID)
AND (o.SimRunID = query1.dpSimRunID) AND (o.OccurrenceID = query1.dpOccurrenceID)
) AS query2 INNER JOIN
(
SELECT pg.Description AS pgDescription, ip.ParticipantID AS
ipParticipantID FROM ParticipantGroup AS pg INNER JOIN InitialParticipant AS ip ON pg.ParticipantGroupID = ip.ParticipantGroupID
) AS query3 ON query2.dpParticipantID = query3.ipParticipantID
) AS query4 ON tmpPartArgs.participantID = query4.dpParticipantID
) AS query5
выполняется за несколько секунд, то есть оператор 'reader = com.ExecuteReader ();' запуск займет всего несколько секунд, но если я попытаюсь создать таблицу из записей, возвращенных вышеуказанным запросом, она не завершится. Может кто-нибудь сказать мне, почему именно это происходит? Я имею в виду, что он может извлечь около 1 200 000 записей за несколько секунд, но что-то идет не так, когда я пытаюсь создать таблицу из этих записей, т.е. CREATE TABLE query5 AS SELECT pgDescription, oSimulationID, oSimRunID, ipParticipantID, ... не завершает выполнение. Пожалуйста помоги! Любые указатели будут действительно полезны.
Единственная причина, по которой я хотел создать временную таблицу с именем query5, заключается в том, что я могу затем создать индексы для этой временной таблицы, то есть query5. Здесь я предположил, что мой исходный запрос (то есть первый фрагмент кода) не завершается из-за проблем с индексацией. Итак, мой другой вопрос: как я могу эффективно вставить около 1 200 000 записей в таблицу за минуту?
Таблицы имеют следующую структуру:
Происшествие
CREATE TABLE "Occurrence" ("SimulationID" smallint(5) NOT NULL DEFAULT 0, "SimRunID" smallint(5) NOT NULL DEFAULT 0, "OccurrenceID" int(10) NOT NULL DEFAULT 0, "OccurrenceTypeID" smallint(5) NOT NULL DEFAULT 0, "Period" smallint(5) NOT NULL DEFAULT 0, "HasSucceeded" bool NOT NULL DEFAULT 0, PRIMARY KEY ("SimulationID", "SimRunID", "OccurrenceID"))
Таблица происшествий содержит около 740 000 записей
DynamicProperty
CREATE TABLE "DynamicProperty" ("SimulationID" smallint(5) NOT NULL DEFAULT 0 ,"SimRunID" smallint(5) NOT NULL DEFAULT 0 ,"ParticipantID" int(10) NOT NULL DEFAULT 0 ,"PropertyTypeID" smallint(5) NOT NULL DEFAULT 0 ,"OccurrenceID" int(10) NOT NULL DEFAULT 0 ,"Val" DOUBLE DEFAULT 0 , PRIMARY KEY ("SimulationID", "SimRunID", "ParticipantID", "PropertyTypeID", "OccurrenceID") )
Таблица DynamicProperty содержит около 6 250 000 записей
PropertyType
CREATE TABLE `PropertyType` (`PropertyTypeID` smallint (5),`PropertyTypeName` varchar (50),`IsAgentProperty` bool NOT NULL,`IsActionProperty` bool NOT NULL, `IsKnowledgeItemProperty` bool NOT NULL,`IsStatic` bool NOT NULL,`IsKnowledgeStoreProperty` bool NOT NULL,`IsSimulationProperty` bool NOT NULL,`IsAssignable` bool NOT NULL, PRIMARY KEY(`PropertyTypeID`))
PropertyType имеет около 50 записей.
InitialParticipant
CREATE TABLE "InitialParticipant" ("ParticipantID" smallint(5) PRIMARY KEY NOT NULL DEFAULT 0, "ParticipantTypeID" smallint(5) NOT NULL DEFAULT 0, "ParticipantGroupID" smallint(5) NOT NULL DEFAULT 0)
У первоначального участника около 120 записей
ParticipantGroup
CREATE TABLE `ParticipantGroup` (`ParticipantGroupID` smallint (5),`ParticipantGroupTypeID` smallint (5),`Description` varchar (50), PRIMARY KEY
(ParticipantGroupID
))
Группа участников имеет около 25 записей.
tmpSimArgs
CREATE TABLE tmpSimArgs (SimulationID smallint(5), SimRunID int(10))
tmpSimArgs имеет около 20 записей.
tmpPartArgs
CREATE TABLE tmpPartArgs(participantID INT)
tmpPartArgs имеет около 80 записей
База данных имеет следующие индексы:
Все первичные ключи соответствующих таблиц, как показано выше.
CREATE INDEX tmpSimArgs_SimulationID_idx ON tmpSimArgs(SimulationID ASC);
CREATE INDEX tmpSimArgs_SimRunID_idx ON tmpSimArgs(SimRunID ASC);
CREATE INDEX tmpPartArgs_participantID_idx ON tmpPartArgs(participantID ASC);
Пожалуйста, помогите !!