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);