On 10/06/2015 02:45 AM, Andrew Cunningham wrote:
>> Ok. My first guess is that you are missing the "suggested index" on the
>> child table. Without this, if there is a foreign key violation in the
>> db, each insert on the parent table will cause a linear scan of the
>> entire child table. With the index, it's just a simple seek.
>>
>> https://www.sqlite.org/foreignkeys.html#fk_indexes
>>
>> If you're unsure, open your database using the command line tool and
>> dump the schema using the ".schema" command. Post that here and someone
>> should be able to tell you if you're missing an index or not.
>>
>
> OK.....
>
> D:\ODB\odb-examples-2.4.0\relationship>D:\ODB\sqlite3.exe test.db
> SQLite version 3.8.11.1 2015-07-29 20:00:57
> Enter ".help" for usage hints.
> sqlite> .schema
> CREATE TABLE "relation_employer" (
>    "name" TEXT NOT NULL PRIMARY KEY);
> CREATE TABLE "relation_project" (
>    "name" TEXT NOT NULL PRIMARY KEY);
> CREATE TABLE "relation_employee" (
>    "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
>    "first" TEXT NOT NULL,
>    "last" TEXT NOT NULL,
>    "employer" TEXT NOT NULL,
>    CONSTRAINT "employer_fk"
>      FOREIGN KEY ("employer")
>      REFERENCES "relation_employer" ("name")
>      DEFERRABLE INITIALLY DEFERRED);
> CREATE TABLE "relation_employee_projects" (
>    "object_id" INTEGER NOT NULL,
>    "value" TEXT NOT NULL,
>    CONSTRAINT "object_id_fk"
>      FOREIGN KEY ("object_id")
>      REFERENCES "relation_employee" ("id")
>      ON DELETE CASCADE,
>    CONSTRAINT "value_fk"
>      FOREIGN KEY ("value")
>      REFERENCES "relation_project" ("name")
>      DEFERRABLE INITIALLY DEFERRED);
> CREATE INDEX "relation_employee_projects_object_id_i"
>    ON "relation_employee_projects" ("object_id");

I think you need indexes on the child key columns that don't already 
have them. i.e.

   CREATE INDEX relation_employee_projects_value_i ON 
relation_employee_projects_value(value);
   CREATE INDEX relation_employee_employer_i ON relation_employee(employer);

Dan.

Reply via email to