SQLite-запрос не завершает выполнение, тогда как Access занимает минуту - PullRequest
1 голос
/ 15 июня 2010

Я очень сильно застрял при попытке завершить выполнение запроса 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 записей в таблицу за минуту?

Таблицы имеют следующую структуру:

  1. Происшествие

    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 записей

  2. 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 записей

  3. 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 записей.

  4. 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 записей

  5. ParticipantGroup

    CREATE TABLE `ParticipantGroup` (`ParticipantGroupID` smallint (5),`ParticipantGroupTypeID` smallint (5),`Description` varchar (50), PRIMARY KEY
    

    (ParticipantGroupID))

    Группа участников имеет около 25 записей.

  6. tmpSimArgs

    CREATE TABLE tmpSimArgs (SimulationID smallint(5), SimRunID int(10))
    

    tmpSimArgs имеет около 20 записей.

  7. tmpPartArgs

    CREATE TABLE tmpPartArgs(participantID INT)
    

    tmpPartArgs имеет около 80 записей

База данных имеет следующие индексы:

  1. Все первичные ключи соответствующих таблиц, как показано выше.

  2. CREATE INDEX tmpSimArgs_SimulationID_idx ON tmpSimArgs(SimulationID ASC); CREATE INDEX tmpSimArgs_SimRunID_idx ON tmpSimArgs(SimRunID ASC);

  3. CREATE INDEX tmpPartArgs_participantID_idx ON tmpPartArgs(participantID ASC);

Пожалуйста, помогите !!

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