I'm running a query against sqlite database and it runs very slow - about 5
seconds(on larger database it can ran for a whole minute). 

 

Select [Node_Entity].* From [Node] AS [Node_Node] JOIN [Entity] AS
[Node_Entity] ON [Node_Node].LOCAL_ID = [Node_Entity].LOCAL_ID , [Link] AS
[Link_Link] JOIN [Entity] AS [Link_Entity] ON [Link_Link].LOCAL_ID =
[Link_Entity].LOCAL_ID 

 

Where (( 

(([Link_Link].[Target.Id]='06d15df5-4253-4a65-b91f-cca52da960fe') AND
([Link_Link].[Source.Id]=[Node_Entity].[Id]))

 

      OR (([Link_Link].[Target.Id]=[Node_Entity].[Id]) AND
([Link_Link].[Source.Id]='06d15df5-4253-4a65-b91f-cca52da960fe'))

     ))

 

 

If I remove a part of where clause 

" OR (([Link_Link].[Target.Id]=[Node_Entity].[Id]) AND
([Link_Link].[Source.Id]='06d15df5-4253-4a65-b91f-cca52da960fe'))" 

 

It runs in 16 ms. All .Id fields are indexed.

 

For me it looks like a bug in optimizer or like created indexes are not used
for some reason

 

Database file with sample data can be downloaded from here -
http://slil.ru/24319807   (350 kb)

 

Database structure is 

 

CREATE TABLE [Entity] (LOCAL_ID bigint NOT NULL , CHANGE_TYPE tinyint NULL ,
[Id] UNIQUEIDENTIFIER NULL , :);

 

CREATE INDEX [IEntity_Id] ON [Entity]([Id]);

 

CREATE INDEX [IEntity_Version.Time] ON [Entity]([Version.Time]);

 

CREATE INDEX [IEntity_Version.ChangedBy.Id] ON
[Entity]([Version.ChangedBy.Id]);

 

CREATE INDEX [IEntity_Type.Id] ON [Entity]([Type.Id]);

 

CREATE UNIQUE INDEX [IEntity_LOCAL_ID] ON [Entity](LOCAL_ID);

 

CREATE TABLE [Link] (LOCAL_ID bigint NOT NULL , [Source.Id] UNIQUEIDENTIFIER
NULL , [Source.Id$C] bit NOT NULL DEFAULT 0 , [Target.Id] UNIQUEIDENTIFIER
NULL , [Target.Id$C] bit NOT NULL DEFAULT 0);

 

CREATE INDEX [ILink_Source.Id] ON [Link]([Source.Id]);

 

CREATE INDEX [ILink_Target.Id] ON [Link]([Target.Id]);

 

CREATE UNIQUE INDEX [ILink_LOCAL_ID] ON [Link](LOCAL_ID);

 

CREATE TABLE [Node] (LOCAL_ID bigint NOT NULL , [NodeName] NTEXT NULL , :);

 

CREATE INDEX [INode_Owner.Id] ON [Node]([Owner.Id]);

 

CREATE UNIQUE INDEX [INode_LOCAL_ID] ON [Node](LOCAL_ID);

Reply via email to