Hello,

> On 10 Apr 2015, at 15:38, Hamish Symington <info at hamishsymington.com> 
> wrote:
> 
>>> A follow up to this. If I run ANALYZE on the ?fast? version of the database
>>> - ie *after* I?ve recreated the index - performance drops back to the
>>> original slow speed.
>> 
>> Please run ".fullschema" using the sqlite3.exe command-line shell on
>> your original database and send us the output.

I've trimmed down the tables, triggers and indexes to a much smaller database; 
the problem still persists. 

The result of .fullschema is as follows:

CREATE TABLE Txn (Txn_ID integer NOT NULL PRIMARY KEY, Txn_UUID varchar NOT 
NULL DEFAULT '', Txn_Modified integer NOT NULL DEFAULT 0, Txn_Created timestamp 
NOT NULL DEFAULT '', Txn_Type integer NOT NULL DEFAULT 0, Txn_Type_m integer 
NOT NULL DEFAULT 0, Txn_ContactUUID varchar NOT NULL DEFAULT '', 
Txn_ContactUUID_m integer NOT NULL DEFAULT 0, Txn_NameFull varchar NOT NULL 
DEFAULT '' COLLATE NOCASE, Txn_NameFull_m integer NOT NULL DEFAULT 0, 
Txn_Company varchar NOT NULL DEFAULT '' COLLATE NOCASE, Txn_Company_m integer 
NOT NULL DEFAULT 0, Txn_Address1 varchar NOT NULL DEFAULT '' COLLATE NOCASE, 
Txn_Address1_m integer NOT NULL DEFAULT 0, Txn_Address2 varchar NOT NULL 
DEFAULT '' COLLATE NOCASE, Txn_Address2_m integer NOT NULL DEFAULT 0, 
Txn_Address3 varchar NOT NULL DEFAULT '' COLLATE NOCASE, Txn_Address3_m integer 
NOT NULL DEFAULT 0, Txn_City varchar NOT NULL DEFAULT '' COLLATE NOCASE, 
Txn_City_m integer NOT NULL DEFAULT 0, Txn_County varchar NOT NULL DEFAULT '' 
COLLATE NOCASE, Txn_County_m integer NOT NULL DEFAULT 0, Txn_Postcode varchar 
NOT NULL DEFAULT '' COLLATE NOCASE, Txn_Postcode_m integer NOT NULL DEFAULT 0, 
Txn_Country varchar NOT NULL DEFAULT '' COLLATE NOCASE, Txn_Country_m integer 
NOT NULL DEFAULT 0, Txn_Date date NOT NULL DEFAULT '', Txn_Date_m integer NOT 
NULL DEFAULT 0, Txn_Amount currency NOT NULL DEFAULT 0, Txn_Amount_m integer 
NOT NULL DEFAULT 0, Txn_Method varchar NOT NULL DEFAULT '' COLLATE NOCASE, 
Txn_Method_m integer NOT NULL DEFAULT 0, Txn_Reference integer NOT NULL DEFAULT 
0, Txn_Reference_m integer NOT NULL DEFAULT 0, Txn_PaymentReference varchar NOT 
NULL DEFAULT '' COLLATE NOCASE, Txn_PaymentReference_m integer NOT NULL DEFAULT 
0, Txn_PaidInDate date NOT NULL DEFAULT '', Txn_PaidInDate_m integer NOT NULL 
DEFAULT 0, Txn_VATReportDate date NOT NULL DEFAULT '', Txn_VATReportDate_m 
integer NOT NULL DEFAULT 0, Txn_Notes varchar NOT NULL DEFAULT '' COLLATE 
NOCASE, Txn_Notes_m integer NOT NULL DEFAULT 0);
CREATE INDEX idx_Txn_UUID ON Txn (Txn_UUID);
CREATE INDEX idx_Txn_ContactUUID ON Txn (Txn_ContactUUID);
CREATE INDEX idx_Txn_Reference ON Txn (Txn_Reference);
CREATE TABLE Appointment (Appointment_ID integer NOT NULL PRIMARY KEY, 
Appointment_UUID varchar NOT NULL DEFAULT '', Appointment_Modified integer NOT 
NULL DEFAULT 0, Appointment_Created timestamp NOT NULL DEFAULT '', 
Appointment_AppointmentTypeUUID varchar NOT NULL DEFAULT '', 
Appointment_AppointmentTypeUUID_m integer NOT NULL DEFAULT 0, 
Appointment_StartDate date NOT NULL DEFAULT '', Appointment_StartDate_m integer 
NOT NULL DEFAULT 0, Appointment_StartTime timestamp NOT NULL DEFAULT '', 
Appointment_StartTime_m integer NOT NULL DEFAULT 0, Appointment_EndTime 
timestamp NOT NULL DEFAULT '', Appointment_EndTime_m integer NOT NULL DEFAULT 
0, Appointment_AddressUUID varchar NOT NULL DEFAULT '', 
Appointment_AddressUUID_m integer NOT NULL DEFAULT 0, Appointment_Description 
varchar NOT NULL DEFAULT '' COLLATE NOCASE, Appointment_Description_m integer 
NOT NULL DEFAULT 0, Appointment_ShootUUID varchar NOT NULL DEFAULT '', 
Appointment_ShootUUID_m integer NOT NULL DEFAULT 0, Appointment_SessionUUID 
varchar NOT NULL DEFAULT '', Appointment_SessionUUID_m integer NOT NULL DEFAULT 
0, Appointment_SessionStartOrEnd varchar NOT NULL DEFAULT '' COLLATE NOCASE, 
Appointment_SessionStartOrEnd_m integer NOT NULL DEFAULT 0, 
Appointment_ContactUUID varchar NOT NULL DEFAULT '', Appointment_ContactUUID_m 
integer NOT NULL DEFAULT 0, Appointment_SaleUUID varchar NOT NULL DEFAULT '', 
Appointment_SaleUUID_m integer NOT NULL DEFAULT 0, Appointment_QuoteUUID 
varchar NOT NULL DEFAULT '', Appointment_QuoteUUID_m integer NOT NULL DEFAULT 
0, Appointment_PurchaseUUID varchar NOT NULL DEFAULT '', 
Appointment_PurchaseUUID_m integer NOT NULL DEFAULT 0, Appointment_TxnUUID 
varchar NOT NULL DEFAULT '', Appointment_TxnUUID_m integer NOT NULL DEFAULT 0, 
Appointment_ResourceUUID varchar NOT NULL DEFAULT '', 
Appointment_ResourceUUID_m integer NOT NULL DEFAULT 0, Appointment_iCalUID 
varchar NOT NULL DEFAULT '' COLLATE NOCASE, Appointment_iCalUID_m integer NOT 
NULL DEFAULT 0, Appointment_iCalMD5 varchar NOT NULL DEFAULT '' COLLATE NOCASE, 
Appointment_iCalMD5_m integer NOT NULL DEFAULT 0, Appointment_SaleItemUUID 
varchar NOT NULL DEFAULT '', Appointment_SaleItemUUID_m integer NOT NULL 
DEFAULT 0, Appointment_GoogleCalendarUID varchar NOT NULL DEFAULT '' COLLATE 
NOCASE, Appointment_GoogleCalendarUID_m integer NOT NULL DEFAULT 0);
CREATE INDEX idx_Appointment_UUID ON Appointment (Appointment_UUID);
CREATE INDEX idx_Appointment_AddressUUID ON Appointment 
(Appointment_AddressUUID);
CREATE INDEX idx_Appointment_ShootUUID ON Appointment (Appointment_ShootUUID);
CREATE INDEX idx_Appointment_SessionUUID ON Appointment 
(Appointment_SessionUUID);
CREATE INDEX idx_Appointment_ContactUUID ON Appointment 
(Appointment_ContactUUID);
CREATE INDEX idx_Appointment_SaleUUID ON Appointment (Appointment_SaleUUID);
CREATE INDEX idx_Appointment_QuoteUUID ON Appointment (Appointment_QuoteUUID);
CREATE INDEX idx_Appointment_PurchaseUUID ON Appointment 
(Appointment_PurchaseUUID);
CREATE INDEX idx_Appointment_ResourceUUID ON Appointment 
(Appointment_ResourceUUID);
CREATE INDEX idx_Appointment_SaleItemUUID ON Appointment 
(Appointment_SaleItemUUID);
     );nCalc_GroupHeadPhone NOT NULL DEFAULT ''T '',
CREATE INDEX idx_TxnCalc_TxnUUID ON TxnCalc(TxnCalc_TxnUUID);
CREATE INDEX idx_TxnCalc_ContactUUID ON TxnCalc(TxnCalc_ContactUUID);
CREATE INDEX idx_appointment_txnuuid on appointment(Appointment_TxnUUID);
ANALYZE sqlite_master;
ANALYZE sqlite_master;
INSERT INTO sqlite_stat1 VALUES('TxnCalc','idx_TxnCalc_ContactUUID','3670 4');
INSERT INTO sqlite_stat1 VALUES('TxnCalc','idx_TxnCalc_TxnUUID','3670 1');
INSERT INTO sqlite_stat1 VALUES('Appointment','idx_appointment_txnuuid','1716 
1716');
INSERT INTO sqlite_stat1 
VALUES('Appointment','idx_Appointment_SaleItemUUID','1716 1716');
INSERT INTO sqlite_stat1 
VALUES('Appointment','idx_Appointment_ResourceUUID','1716 1716');
INSERT INTO sqlite_stat1 
VALUES('Appointment','idx_Appointment_PurchaseUUID','1716 1716');
INSERT INTO sqlite_stat1 VALUES('Appointment','idx_Appointment_QuoteUUID','1716 
1716');
INSERT INTO sqlite_stat1 VALUES('Appointment','idx_Appointment_SaleUUID','1716 
1716');
INSERT INTO sqlite_stat1 
VALUES('Appointment','idx_Appointment_ContactUUID','1716 31');
INSERT INTO sqlite_stat1 
VALUES('Appointment','idx_Appointment_SessionUUID','1716 1716');
INSERT INTO sqlite_stat1 VALUES('Appointment','idx_Appointment_ShootUUID','1716 
2');
INSERT INTO sqlite_stat1 
VALUES('Appointment','idx_Appointment_AddressUUID','1716 429');
INSERT INTO sqlite_stat1 VALUES('Appointment','idx_Appointment_UUID','1716 1');
INSERT INTO sqlite_stat1 VALUES('Txn','idx_Txn_Reference','3670 1');
INSERT INTO sqlite_stat1 VALUES('Txn','idx_Txn_ContactUUID','3670 4');
INSERT INTO sqlite_stat1 VALUES('Txn','idx_Txn_UUID','3670 1');
ANALYZE sqlite_master;



In the middle of all that, after the line
CREATE INDEX idx_Appointment_SaleItemUUID ON Appointment 
(Appointment_SaleItemUUID);
is some slightly odd output - that's just as it appears in the command line 
output in Terminal on my Mac. If you need to know what TxnCalc actually is, 
then it's this:

CREATE TABLE TxnCalc (TxnCalc_TxnUUID VARCHAR, TxnCalc_UnallocatedSum currency, 
TxnCalc_AllocatedSum currency, TxnCalc_Amount currency NOT NULL DEFAULT 0.00, 
TxnCalc_Type NOT NULL DEFAULT '', TxnCalc_Date date NOT NULL DEFAULT '', 
TxnCalc_Method NOT NULL DEFAULT '', TxnCalc_NameFull NOT NULL DEFAULT '', 
TxnCalc_Company NOT NULL DEFAULT '', TxnCalc_ContactUUID NOT NULL DEFAULT '', 
TxnCalc_Year NOT NULL DEFAULT '', TxnCalc_Month NOT NULL DEFAULT '', 
TxnCalc_Email NOT NULL DEFAULT '', TxnCalc_Phone NOT NULL DEFAULT '', 
TxnCalc_Website NOT NULL DEFAULT '', TxnCalc_GroupHeadEmail NOT NULL DEFAULT 
'', TxnCalc_GroupHeadPhone NOT NULL DEFAULT '');

For the avoidance of doubt, the output above is from when the query is slow. If 
I drop idx_appointment_txnuuid and recreate it, then the query is fast; the 
line 
INSERT INTO sqlite_stat1 VALUES('Appointment','idx_appointment_txnuuid','1716 
1716');
is then missing from the .fullschema output, but all the rest (including the 
line which creates the index) is the same.
If I then run ANALYZE and run .fullschema again, the line
INSERT INTO sqlite_stat1 VALUES('Appointment','idx_appointment_txnuuid','1716 
1716');
has reappeared. 

Hopefully this will give some of you who know more about SQLite than I do 
something to go on! 

Best wishes,

Hamish


Reply via email to