Index Not use in basic query - database-indexes

Having the table block:
CREATE TABLE IF NOT EXISTS "block" (
"hash" char(66) CONSTRAINT block_pk PRIMARY KEY,
"size" text,
"miner" text ,
"nonce" text,
"number" text,
"number_int" integer not null,
"gasused" text ,
"mixhash" text ,
"gaslimit" text ,
"extradata" text ,
"logsbloom" text,
"stateroot" char(66) ,
"timestamp" text ,
"difficulty" text ,
"parenthash" char(66) ,
"sha3uncles" char(66) ,
"receiptsroot" char(66),
"totaldifficulty" text ,
"transactionsroot" char(66)
);
CREATE INDEX number_int_index ON block (number_int);
The table has about 3M of rows , when a query a simple query the results are:
EXPLAIN ANALYZE select number_int from block where number_int > 1999999 and number_int < 2999999 order by number_int desc limit 1;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
Limit (cost=110.00..110.00 rows=1 width=4) (actual time=16154.891..16154.894 rows=1 loops=1)
-> Sort (cost=110.00..112.50 rows=1000 width=4) (actual time=16154.890..16154.890 rows=1 loops=1)
Sort Key: number_int DESC
Sort Method: top-N heapsort Memory: 25kB
-> Seq Scan on block (cost=0.00..105.00 rows=1000 width=4) (actual time=172.766..16126.135 rows=190186 loops=1)
Remote Filter: ((number_int > 1999999) AND (number_int < 2999999))
Planning Time: 19.961 ms
Execution Time: 16155.382 ms
Peak Memory Usage: 1113 kB
(9 rows)
any advice?
Regards
I tried something I've found here in stackoverflow with the same result
select number_int from block where number_int > 1999999 and number_int < 2999999 order by number_int+0 desc limit 1;

Hi the problem was related to yugabyte, there was not a issue with a index or with other stuff related with postgres, I ended up migrated to a self-managed database, but at least yugabyte is fully compatible with postgres because I migrated with pg_dump without any problem. It worth it when you are starting if you don't want to manage the database server.

Related

Very slow database query migrating from django 1.8 to django 3.2

I migrated a project from django1.8 to django3.2. I'm using the same database but the function I use to build a report is four times slower (8 seconds on Django1.8 and 30/40 seconds with django3.2). The database is MySQL version 5.7 (I also tried version 8.0.32 but nothing changed).
This is the query:
qs = PartitaDanno.objects.filter(incarico__cliente_intestatario_fattura_id=8006
).select_related('incarico', 'anagrafica_assctp', 'incarico__naturaincarico'
).prefetch_related('rate'
).order_by('-incarico__anno', '-incarico__numero', 'pk')
PartitaDanno is a table with 16000 rows and the model has 215 fields (I know..I didn't write it). The result of this query are just 1700 rows..a very small result.
The unusual thing is that even if I use a simple query on this model like
qs = PartitaDanno.objects.filter(incarico__cliente_intestatario_fattura_id=8006)
It takes 20 seconds to iterate through result of this basic query..I don't understand.
The raw sql query is the same in both versions of Django. This is the first queryset raw query:
SELECT `sinistri_partitadanno`.`id`, `sinistri_partitadanno`.`created`, `sinistri_partitadanno`.`modified`, `sinistri_partitadanno`.`incarico_id`, `sinistri_partitadanno`.`tipo`, `sinistri_partitadanno`.`tipologia_controparte`, `sinistri_partitadanno`.`fase`, `sinistri_partitadanno`.`competenza_giurisdizionale`, `sinistri_partitadanno`.`soggetto`, `sinistri_partitadanno`.`anagrafica_assctp_id`, `sinistri_partitadanno`.`luogo`, `sinistri_partitadanno`.`compagnia_id`, `sinistri_partitadanno`.`riferimento_compagnia`, `sinistri_partitadanno`.`tipo_di_danno`, `sinistri_partitadanno`.`tipo_lesioni`, `sinistri_partitadanno`.`tipologia_vittima`, `sinistri_partitadanno`.`modello_veicolo`, `sinistri_partitadanno`.`targa_veicolo`, `sinistri_partitadanno`.`riserva_iniziale`, `sinistri_partitadanno`.`riserva_parziale`, `sinistri_partitadanno`.`data_richiesta_danni_ctp`, `sinistri_partitadanno`.`reiezione_cautelativa`, `sinistri_partitadanno`.`data_reiezione_cautelativa`, `sinistri_partitadanno`.`importo_richiesto_da_ctp`, `sinistri_partitadanno`.`data_incarico_nostro_perito`, `sinistri_partitadanno`.`tipologia_perizia`, `sinistri_partitadanno`.`nominativo_perito`, `sinistri_partitadanno`.`data_perizia_negativa`, `sinistri_partitadanno`.`motivazioni_perizia_negativa`, `sinistri_partitadanno`.`data_interlocutoria_inviata_dal_perito`, `sinistri_partitadanno`.`importo_stimato_dal_perito`, `sinistri_partitadanno`.`data_ricezione_perizia_dal_nostro_perito`, `sinistri_partitadanno`.`riparazione_antieconomica`, `sinistri_partitadanno`.`data_incarico_medico_legale`, `sinistri_partitadanno`.`data_ricezione_perizia_dal_nostro_medico_legale`, `sinistri_partitadanno`.`data_invio_offerta_tramite_transazione_quietanza`, `sinistri_partitadanno`.`data_reiezione_indennizzo_risarcimento`, `sinistri_partitadanno`.`pagamento_parziale`, `sinistri_partitadanno`.`capitale`, `sinistri_partitadanno`.`data_pagamento_capitale`, `sinistri_partitadanno`.`anagrafica_patrocinatore_id`, `sinistri_partitadanno`.`tipo_patrocinatore`, `sinistri_partitadanno`.`cf_piva_patrocinatore`, `sinistri_partitadanno`.`numero_rif_patrocinatore`, `sinistri_partitadanno`.`spese_legali`, `sinistri_partitadanno`.`data_pagamento_spese_legali`, `sinistri_partitadanno`.`integrazione_capitale`, `sinistri_partitadanno`.`data_pag_integraz_capitale`, `sinistri_partitadanno`.`integrazione_spese_legali`, `sinistri_partitadanno`.`data_pag_integraz_spese_legali`, `sinistri_partitadanno`.`note_generali`, `sinistri_partitadanno`.`note_pagamenti`, `sinistri_partitadanno`.`cessione_del_credito`, `sinistri_partitadanno`.`veicolo_sostitutivo`, `sinistri_partitadanno`.`importo_noleggio_veicolo_sostitutivo`, `sinistri_partitadanno`.`altre_spese_accessorie_richieste`, `sinistri_partitadanno`.`importo_altre_spese_accessorie_richieste`, `sinistri_partitadanno`.`importo_onorari_richiesti`, `sinistri_partitadanno`.`liquidazione_diretta_senza_perizia`, `sinistri_partitadanno`.`offerta_lesioni_a_stralcio`, `sinistri_partitadanno`.`richiesto_nulla_osta_giudice_tutelare`, `sinistri_partitadanno`.`data_ricezione_nulla_osta_giudice_tutelare`, `sinistri_partitadanno`.`note_fase_precontenziosa`, `sinistri_partitadanno`.`certificato_di_chiusura_malattia`, `sinistri_partitadanno`.`data_ricezione_cert_chiusura_malattia`, `sinistri_partitadanno`.`richiesta_accesso_agli_atti`, `sinistri_partitadanno`.`data_ricezione_richiesta_accesso_agli_atti`, `sinistri_partitadanno`.`data_risposta_accesso_agli_atti`, `sinistri_partitadanno`.`note_accesso_agli_atti`, `sinistri_partitadanno`.`atto_di_citazione`, `sinistri_partitadanno`.`data_notifica_atto_di_citazione`, `sinistri_partitadanno`.`valore_causa`, `sinistri_partitadanno`.`valore_giudiziale_riservato`, `sinistri_partitadanno`.`mediazione`, `sinistri_partitadanno`.`data_notifica_mediazione`, `sinistri_partitadanno`.`data_risposta_mediazione`, `sinistri_partitadanno`.`note_su_adr`, `sinistri_partitadanno`.`domiciliatario_sled_id`, `sinistri_partitadanno`.`autorita_evocata_id`, `sinistri_partitadanno`.`nome_del_giudice`, `sinistri_partitadanno`.`sezione_tribunale`, `sinistri_partitadanno`.`ruolo_generale`, `sinistri_partitadanno`.`prima_udienza_in_atto_introduttivo`, `sinistri_partitadanno`.`adempimento_udienza`, `sinistri_partitadanno`.`rinvio_all_udienza_del`, `sinistri_partitadanno`.`scadenza_adempimento`, `sinistri_partitadanno`.`tipologia_adempimento`, `sinistri_partitadanno`.`numero_sentenza`, `sinistri_partitadanno`.`data_ricezione_sentenza`, `sinistri_partitadanno`.`pubblicazione_sentenza`, `sinistri_partitadanno`.`data_prima_udienza`, `sinistri_partitadanno`.`note`, `sinistri_partitadanno`.`adempimento_svolto`, `sinistri_partitadanno`.`reclamo_ivass`, `sinistri_partitadanno`.`data_ricezione_reclamo_ivass`, `sinistri_partitadanno`.`studio_legale_incaricato`, `sinistri_partitadanno`.`dettaglio_riserva_rivalsa`, `sinistri_partitadanno`.`dettaglio_esborsi_pagati_sled`, `sinistri_partitadanno`.`descrizione_esborsi_pagati_sled`, `sinistri_partitadanno`.`dettaglio_importi_recuperati_da_sled`, `sinistri_partitadanno`.`ricevuta_richiesta_danni_ctp`, `sinistri_partitadanno`.`data_ricezione_richiesta_danni_ctp`, `sinistri_partitadanno`.`termini_legali_di_risposta_ctp`, `sinistri_partitadanno`.`motivi_reiezione_cautelativa`, `sinistri_partitadanno`.`data_integraz_elementi_ctp`, `sinistri_partitadanno`.`data_ricezione_transazione_quietanza_firmata`, `sinistri_partitadanno`.`data_ricezione_rifiuto_offerta`, `sinistri_partitadanno`.`motivi_reiezione_indennizzo`, `sinistri_partitadanno`.`clausole_particolari`, `sinistri_partitadanno`.`incarico_gestione_relitto`, `sinistri_partitadanno`.`destinazione_relitto`, `sinistri_partitadanno`.`data_ricezione_incarico`, `sinistri_partitadanno`.`valore_commerciale`, `sinistri_partitadanno`.`spese_diverse_relitto`, `sinistri_partitadanno`.`tipologia_spesa_relitto`, `sinistri_partitadanno`.`importo_vendita`, `sinistri_partitadanno`.`data_bonifico`, `sinistri_partitadanno`.`acquirente`, `sinistri_partitadanno`.`data_voltura_demolizione`, `sinistri_partitadanno`.`note_gestione_relitti`, `sinistri_partitadanno`.`data_ricezione_citazione`, `sinistri_partitadanno`.`data_richiesta_pagamento_bo`, `sinistri_partitadanno`.`stato_chiusura`, `sinistri_partitadanno`.`tipo_chiusura_con_pagamento`, `sinistri_partitadanno`.`tipo_chiusura_senza_seguito`, `sinistri_partitadanno`.`tipo_chiusura_con_recupero`, `sinistri_partitadanno`.`data_apertura`, `sinistri_partitadanno`.`data_chiusura`, `sinistri_partitadanno`.`data_riapertura`, `sinistri_partitadanno`.`anagrafica_cessionario_id`, `sinistri_partitadanno`.`minore`, `sinistri_partitadanno`.`anag_esercente_potesta_id`, `sinistri_partitadanno`.`anagrafica_erede_id`, `sinistri_partitadanno`.`investigazione_antifrode`, `sinistri_partitadanno`.`data_appuntamento_perito`, `sinistri_partitadanno`.`data_ricezione_doc_completi`, `sinistri_partitadanno`.`data_incarico_agenzia_pa`, `sinistri_partitadanno`.`data_ricezione_doc_da_agenzia_pa`, `sinistri_partitadanno`.`veicolo_in_deposito`, `sinistri_partitadanno`.`veicolo_sotto_sequestro`, `sinistri_partitadanno`.`data_dissequestro`, `sinistri_partitadanno`.`data_invio_offerta_vendita`, `sinistri_partitadanno`.`tipologia_perizia_medica`, `sinistri_partitadanno`.`nominativo_medico`, `sinistri_partitadanno`.`data_appuntamento`, `sinistri_partitadanno`.`data_interlocutoria_medica`, `sinistri_partitadanno`.`data_perizia_medica_negativa`, `sinistri_partitadanno`.`motivazioni_perizia_medica_negativa`, `sinistri_partitadanno`.`tassa_di_registro`, `sinistri_partitadanno`.`data_pagamento_tassa_di_registro`, `sinistri_partitadanno`.`negoziazione_assistita`, `sinistri_partitadanno`.`causa_penale`, `sinistri_partitadanno`.`data_prossima_udienza`, `sinistri_partitadanno`.`note_causa_penale`, `sinistri_partitadanno`.`decreto_ingiuntivo`, `sinistri_partitadanno`.`tipologia_rito`, `sinistri_partitadanno`.`fase_procedura`, `sinistri_partitadanno`.`conclusione`, `sinistri_partitadanno`.`numero_di_polizza`, `sinistri_partitadanno`.`conducente`, `sinistri_partitadanno`.`anagrafica_conducente_id`, `sinistri_partitadanno`.`estratti_autentici`, `sinistri_partitadanno`.`nome_notaio`, `sinistri_partitadanno`.`data_autentica`, `sinistri_partitadanno`.`data_invio_messa_in_mora`, `sinistri_partitadanno`.`data_ricezione_messa_in_mora`, `sinistri_partitadanno`.`data_notifica_titolo_giudiziale`, `sinistri_partitadanno`.`atto_di_precetto`, `sinistri_partitadanno`.`data_notifica_precetto`, `sinistri_partitadanno`.`somme_incassate`, `sinistri_partitadanno`.`data_incasso`, `sinistri_partitadanno`.`n_decreto_ingiuntivo`, `sinistri_partitadanno`.`r_g_decreto_ingiuntivo`, `sinistri_partitadanno`.`data_emissione_decreto_ingiuntivo`, `sinistri_partitadanno`.`data_notifica_decreto_ingiuntivo`, `sinistri_partitadanno`.`capitale_liquidato_decreto_ingiuntivo`, `sinistri_partitadanno`.`onorari_liquidati_decreto_ingiuntivo`, `sinistri_partitadanno`.`data_apposizione_formula_esecutiva`, `sinistri_partitadanno`.`importo_atto_di_precetto`, `sinistri_partitadanno`.`data_notifica_precetto_rinnovazione`, `sinistri_partitadanno`.`data_notifica_pignoramento_mobiliare`, `sinistri_partitadanno`.`rge_pignoramento_mobiliare`, `sinistri_partitadanno`.`data_notifica_pignoramento_presso_terzi`, `sinistri_partitadanno`.`iscrizione_ruolo_pignoramento_presso_terzi`, `sinistri_partitadanno`.`rge_pignoramento_presso_terzi`, `sinistri_partitadanno`.`data_notifica_pignoramento_immobiliare`, `sinistri_partitadanno`.`iscrizione_ruolo_pignoramento_immobiliare`, `sinistri_partitadanno`.`rge_pignoramento_immobiliare`, `sinistri_partitadanno`.`data_trascrizione_pignoramento_immobiliare`, `sinistri_partitadanno`.`anagrafica_amministratore_id`, `sinistri_partitadanno`.`progressivo_uci_ctp`, `sinistri_partitadanno`.`codice_servizio`, `sinistri_partitadanno`.`lotto_affidato`, `sinistri_partitadanno`.`importo_affidato`, `sinistri_partitadanno`.`capitale_azionato`, `sinistri_partitadanno`.`calc_capitale_azionato`, `sinistri_partitadanno`.`note_recupero_crediti`, `sinistri_partitadanno`.`note_status`, `sinistri_partitadanno`.`note_gestione`, `sinistri_incarico`.`id`, `sinistri_incarico`.`created`, `sinistri_incarico`.`modified`, `sinistri_incarico`.`ufficio_sled`, `sinistri_incarico`.`natura_incarico`, `sinistri_incarico`.`naturaincarico_id`, `sinistri_incarico`.`progetto_id`, `sinistri_incarico`.`status`, `sinistri_incarico`.`data_chiusura_incarico`, `sinistri_incarico`.`numero`, `sinistri_incarico`.`anno`, `sinistri_incarico`.`numero_incarico_sled`, `sinistri_incarico`.`avvocato_incaricato_id`, `sinistri_incarico`.`data_affidamento_avvocato`, `sinistri_incarico`.`cliente_intestatario_fattura_id`, `sinistri_incarico`.`fronter_cliente`, `sinistri_incarico`.`intermediario_id`, `sinistri_incarico`.`numero_incarico_cliente`, `sinistri_incarico`.`locatario_id`, `sinistri_incarico`.`numero_di_polizza`, `sinistri_incarico`.`codice_evento`, `sinistri_incarico`.`tipologia_sinistro`, `sinistri_incarico`.`riserva_totale`, `sinistri_incarico`.`onorari_ed_anticipazioni_sled`, `sinistri_incarico`.`data_fattura_onorari_ed_anticipazioni_sled`, `sinistri_incarico`.`numero_fattura_sled`, `sinistri_incarico`.`data_incasso_onorari_ed_anticipazioni_sled`, `sinistri_incarico`.`totale_pagato_come_risarcimento`, `sinistri_incarico`.`totale_onorari_ed_anticipazioni_pagati_a_sled`, `sinistri_incarico`.`totale_importi_recuperati_da_sled`, `sinistri_incarico`.`costo_totale_del_sinistro`, `sinistri_incarico`.`data_ricezione_fondi`, `sinistri_incarico`.`data_del_sinistro`, `sinistri_incarico`.`ora_del_sinistro`, `sinistri_incarico`.`luogo_del_sinistro`, `sinistri_incarico`.`stato`, `sinistri_incarico`.`data_ricezione_incarico_sled`, `sinistri_incarico`.`data_apertura_incarico_sled`, `sinistri_incarico`.`data_riapertura_incarico_sled`, `sinistri_incarico`.`targa_veicolo_assicurato`, `sinistri_incarico`.`assicurato`, `sinistri_incarico`.`proprietario`, `sinistri_incarico`.`nome_conducente`, `sinistri_incarico`.`cognome_conducente`, `sinistri_incarico`.`modello_veicolo`, `sinistri_incarico`.`blackbox`, `sinistri_incarico`.`data_installazione_blackbox`, `sinistri_incarico`.`cai_2f`, `sinistri_incarico`.`data_ricezione_cai_2f`, `sinistri_incarico`.`autorita_intervenuta`, `sinistri_incarico`.`verbale_autorita`, `sinistri_incarico`.`data_ricezione_verbale_autorita`, `sinistri_incarico`.`testimonianza`, `sinistri_incarico`.`nome_testimone`, `sinistri_incarico`.`testimone_id`, `sinistri_incarico`.`data_ricezione_testimonianza`, `sinistri_incarico`.`denuncia_di_sinistro`, `sinistri_incarico`.`data_ricezione_denuncia_sx`, `sinistri_incarico`.`franchigia_si_no`, `sinistri_incarico`.`importo_franchigia`, `sinistri_incarico`.`data_richiesta_copertura`, `sinistri_incarico`.`esito_copertura`, `sinistri_incarico`.`data_inizio_copertura`, `sinistri_incarico`.`data_fine_copertura`, `sinistri_incarico`.`note_sulla_copertura`, `sinistri_incarico`.`garanzia`, `sinistri_incarico`.`pagamento_totale_del_sinistro`, `sinistri_incarico`.`sinistro_con_lesioni_personali_gravi_o_gravissime`, `sinistri_incarico`.`sinistro_mortale`, `sinistri_incarico`.`liq_cliente_incaricato`, `sinistri_incarico`.`scoperto`, `sinistri_incarico`.`limite_di_indennizzo`, `sinistri_incarico`.`esclusioni_di_polizza`, `sinistri_incarico`.`note_aggiuntive`, `sinistri_incarico`.`importo_da_recuperare`, `sinistri_incarico`.`calc_importo_da_recuperare`, `sinistri_incarico`.`importo_prescritto`, `sinistri_incarico`.`fermo_tecnico`, `sinistri_incarico`.`tutela_legale`, `sinistri_incarico`.`compagnia_tutela_legale_id`, `sinistri_incarico`.`data_effetto_polizza`, `sinistri_incarico`.`data_scadenza_polizza`, `sinistri_incarico`.`data_pagamento_premio`, `sinistri_incarico`.`codice_agenzia`, `sinistri_incarico`.`onorari`, `sinistri_incarico`.`pratica_procurata_da_id`, `sinistri_incarico`.`rif_uci`, `sinistri_incarico`.`liquidatore_uci`, `sinistri_incarico`.`rif_consap`, `sinistri_incarico`.`branding`, `sinistri_naturaincarico`.`id`, `sinistri_naturaincarico`.`label`, `sinistri_naturaincarico`.`codice_fatturazione`, `sinistri_naturaincarico`.`tipo_workflow`, T5.`id`, T5.`created`, T5.`modified`, T5.`tipo`, T5.`denominazione_giuridica`, T5.`titolo`, T5.`cognome_ragione_sociale`, T5.`nome`, T5.`rappr_sinistro_in_italia`, T5.`indirizzo`, T5.`citta`, T5.`provincia`, T5.`cap`, T5.`telefono`, T5.`fax`, T5.`cellulare`, T5.`email`, T5.`pec`, T5.`codice_fiscale`, T5.`partita_iva`, T5.`professione`, T5.`luogo_di_nascita`, T5.`data_di_nascita`, T5.`sesso`, T5.`codice_iban`, T5.`note`, T5.`blacklist`, T5.`tempi_pagamento`, T5.`codice_fatturazione`, T5.`naturacosto_id`, T5.`nazione`, T5.`codice_uci`, T5.`importata_da_xml` FROM `sinistri_partitadanno` INNER JOIN `sinistri_incarico` ON (`sinistri_partitadanno`.`incarico_id` = `sinistri_incarico`.`id`) LEFT OUTER JOIN `sinistri_naturaincarico` ON (`sinistri_incarico`.`naturaincarico_id` = `sinistri_naturaincarico`.`id`) LEFT OUTER JOIN `sinistri_anagrafica` T5 ON (`sinistri_partitadanno`.`anagrafica_assctp_id` = T5.`id`) WHERE `sinistri_incarico`.`cliente_intestatario_fattura_id` = 8006 ORDER BY `sinistri_incarico`.`anno` DESC, `sinistri_incarico`.`numero` DESC, `sinistri_partitadanno`.`id` ASC
This is the result of queryset.explain():
-> Sort row IDs: sinistri_incarico.anno DESC, sinistri_incarico.numero DESC, sinistri_partitadanno.id (actual time=163.955..172.010 rows=1761 loops=1)
-> Table scan on <temporary> (cost=2518.91..2544.83 rows=1874) (actual time=153.040..163.135 rows=1761 loops=1)
-> Temporary table (cost=2518.90..2518.90 rows=1874) (actual time=153.007..153.007 rows=1761 loops=1)
-> Nested loop left join (cost=2331.46 rows=1874) (actual time=0.247..62.163 rows=1761 loops=1)
-> Nested loop inner join (cost=1675.43 rows=1874) (actual time=0.224..52.547 rows=1761 loops=1)
-> Nested loop left join (cost=1019.40 rows=1677) (actual time=0.089..17.068 rows=1677 loops=1)
-> Index lookup on sinistri_incarico using b842d1d4b6d5fa98d8dc06d2c92e02c5 (cliente_intestatario_fattura_id=8006) (cost=432.45 rows=1677) (actual time=0.081..15.586 rows=1677 loops=1)
-> Single-row index lookup on sinistri_naturaincarico using PRIMARY (id=sinistri_incarico.naturaincarico_id) (cost=0.25 rows=1) (actual time=0.001..0.001 rows=1 loops=1677)
-> Index lookup on sinistri_partitadanno using sinistri_pa_incarico_id_398e55f0a3d8c2c0_fk_sinistri_incarico_id (incarico_id=sinistri_incarico.id) (cost=0.28 rows=1) (actual time=0.018..0.021 rows=1 loops=1677)
-> Single-row index lookup on T5 using PRIMARY (id=sinistri_partitadanno.anagrafica_assctp_id) (cost=0.25 rows=1) (actual time=0.005..0.005 rows=1 loops=1761)
Of course it slow down when I start iterating the queryset with a for loop. I don't use iterator() on the complex query because I'm using prefetch_related.
--- First Edit ---
This is the result for raw query in phpmyadmin. It's really fast (3.5 seconds to make the query and build the table with results)
Thanks for your help!

YugabyteDB not using expression index on json column

[Question posted by a user of YugabyteDB]
I'm having difficulty making the query planner use the index in the query below:
postgres=# create table books(k int primary key, doc jsonb not null);
postgres=# CREATE INDEX books_year
ON books (((doc->>'year')::int) ASC)
WHERE doc->>'year' is not null;
postgres=# EXPLAIN select
(doc->>'ISBN')::bigint as isbn,
doc->>'title' as title,
(doc->>'year')::int as year
from books
where (doc->>'year')::int > 1850
order by 3;
QUERY PLAN
-----------------------------------------------------------------
Sort (cost=177.33..179.83 rows=1000 width=44)
Sort Key: (((doc ->> 'year'::text))::integer)
-> Seq Scan on books (cost=0.00..127.50 rows=1000 width=44)
Filter: (((doc ->> 'year'::text))::integer > 1850)
(4 rows)
While querying by string value, looks like it's using it:
postgres=# EXPLAIN select
(doc->>'ISBN')::bigint as isbn,
doc->>'title' as title,
(doc->>'year')::int as year
from books
where (doc->>'year') = '1988'
order by 3;
QUERY PLAN
------------------------------------------------------------------------------
Index Scan using books_year on books (cost=0.00..125.50 rows=1000 width=44)
Filter: ((doc ->> 'year'::text) = '1988'::text)
(2 rows)
The predicate on the index and query must match like below:
postgres=# CREATE INDEX books_year ON books (((doc->>'year')::int) asc) where doc->>'year' is not null;
postgres=# EXPLAIN select
(doc->>'ISBN')::bigint as isbn,
doc->>'title' as title,
(doc->>'year')::int as year
from books
where (doc->>'year')::int > 1850 and doc->>'year' is not null;
QUERY PLAN
--------------------------------------------------------------------------
Index Scan using books_year on books (cost=0.00..5.24 rows=10 width=44)
Index Cond: (((doc ->> 'year'::text))::integer > 1850)
(2 rows)

Cassandra CQL alternative to OR in WHERE clause

Here's the code I used to create the table:
CREATE TABLE test.packages (
packageuuid timeuuid,
ruserid text,
suserid text,
timestamp int,
PRIMARY KEY (ruserid, suserid, packageuuid, timestamp)
);
and then I create a materialized view:
CREATE MATERIALIZED VIEW test.packages_by_userid
AS SELECT * FROM test.packages
WHERE ruserid IS NOT NULL
AND suserid IS NOT NULL
AND TIMESTAMP IS NOT NULL
AND packageuuid IS NOT NULL
PRIMARY KEY (ruserid, suserid, timestamp, packageuuid)
WITH CLUSTERING ORDER BY (packageuuid DESC);
I want to be able to search for packages sent between two IDs
so I would need something like this:
SELECT * FROM test.packages_by_userid WHERE (ruserid = '1' AND suserid = '2' AND suserid = '1' AND ruserid = '2') AND timestamp > 1496601553;
How would I accomplish something like this with CQL?
I've searched a bit but I can't figure it out.
I'm willing to change the structure of the table if it will make something like this possible.
If it's doable without a materialized view that would also be good.
Use In Clause:
SELECT * FROM test.packages_by_userid WHERE ruserid IN ( '1', '2') AND suserid IN ( '1','2') AND timestamp > 1496601553;
Note : Keep the in clause size smaller, Large in clause in the partition can cause GC pauses and heap pressure that leads to overall slower performance
In practical terms this means you’re waiting on this single coordinator node to give you a response, it’s keeping all those queries and their responses in the heap, and if one of those queries fails, or the coordinator fails, you have to retry the whole thing.
If the multiple partition in clause larger try to use separate query, for each partition (ruserid) with executeAsync.
SELECT * FROM test.packages_by_userid WHERE ruserid = '1' AND suserid IN ( '1','2') AND timestamp > 1496601553;
SELECT * FROM test.packages_by_userid WHERE ruserid = '2' AND suserid IN ( '1','2') AND timestamp > 1496601553;
Learn More : https://lostechies.com/ryansvihla/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions/
Since you always search for both sender and receiver, I'd model this with the following table layout:
CREATE TABLE test.packages (
ruserid text,
suserid text,
timestamp int,
packageuuid timeuuid,
PRIMARY KEY ((ruserid, suserid), timestamp)
);
In this way, for each pair of sender/receiver you need to run two queries, one for each partition:
SELECT * FROM packages WHERE ruserid=1 AND suserid=2 AND timestamp > 1496601553;
SELECT * FROM packages WHERE ruserid=2 AND suserid=1 AND timestamp > 1496601553;
This is IMHO the best solution because, remember, in Cassandra you start from your queries and build your table models on that, never the reverse.

Cassandra CQL range query rejected despite equality operator and secondary index

From the table schema below, I am trying to select all pH readings that are below 5.
I have followed these three pieces of advice:
Use ALLOW FILTERING
Include an equality comparison
Create a secondary index on the reading_value column.
Here is my query:
select * from todmorden_numeric where sensor_name = 'pHradio' and reading_value < 5 allow filtering;
Which is rejected with this message:
Bad Request: No indexed columns present in by-columns clause with Equal operator
I tried adding a secondary index to the sensor_name column and was told that it was already part of the key and therefore already indexed.
I created the index after the table had been in use for a while - could that be the problem? I ran "nodetool refresh" in the hope it would make the index available but this did not work. Here is the output of describe table todmorden_numeric :
CREATE TABLE todmorden_numeric (
sensor_name text,
reading_time timestamp,
reading_value float,
PRIMARY KEY ((sensor_name), reading_time)
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='Data that suits being stored as floats' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
CREATE INDEX todmorden_numeric_reading_value_idx ON todmorden_numeric (reading_value);
Cassandra allows range search only on:
a) Partition Key only if ByteOrderPartitioner is used (default now is murmur3).
b) any single clustering key ONLY IF any clustering keys defined BEFORE the target column in the primary key definition are already specified by an = operator in the predicate.
They don't work on secondary indices.
Consider the following table definition:
CREATE TABLE tod1 (name text, time timestamp,
val float, PRIMARY KEY (name, time));
You CAN'T do a range on the val in this case.
Consider this one:
CREATE TABLE tod2 (name text, time timestamp,
val float, PRIMARY KEY (name, time, val));
Then the following is valid:
SELECT * FROM tod2 WHERE name='X' AND time='timehere' AND val < 5;
Kinda pointless, but this is not valid:
SELECT * from tod2 WHERE name='X' AND val < 5;
It's not valid as you haven't filtered by a previous clustering key in the primary key def (in this case, time).
For your query, you may want to do this:
CREATE TABLE tod3 (name text, time timestamp,
val float, PRIMARY KEY (name, val, time));
Note the order of columns in the primary key: val's before time.
This will allow you to do:
SELECT * from tod3 WHERE name='asd' AND val < 5;
On a different note, how long do you intend to hold data? How frequently do you get readings? This can cause your partition to grow quite large quite quickly. You may want to bucket it readings into multiple partitions (manual sharding). Perhaps one partition per day? Of course, such things would greatly depend on your access patterns.
Hope that helps.

cassandra cql query with in condition in rowkey and in clustering columns

I am a newbie to cassandra. And i have a table with composite primary key. The description of the table is
CREATE TABLE testtable (
foid bigint,
id bigint,
severity int,
category int,
ack boolean,
PRIMARY KEY (foid, id, severity, category)
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='NONE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
My requirement is that i need to query the table with foid with in condition and id with range condition and severity with in condition
so when i tried the following query
select * from testtable where foid in (5,6) and id>10 and severity in (5);
i got the error message as
select * from testtable where foid in (5,6) and id>10 and severity in (5);
or even the equal condition on the severity column is suffice for me which won't work either.
Is there any way that the same can be accomplished
I tried with secondary indexes for severity and category too and that did not give me anything positive.
You need to successively restrict the primary keys, so the following will work:
select * from testtable where foid in (1) and id=2 and severity<20 ;
but this won't:
select * from testtable where foid in (1) and id>10 and severity=3;
What about making the query less restrictive (as you suggested in your question) as follows
select * from testtable where foid in (5,6) and id>10
And sorting through the results at the client side?
An alternative (and probably more attractive) solution would be to order your keys according to how you are going to perform the query, e.g.,
CREATE TABLE testtable2 (
foid bigint,
severity int,
id bigint,
category int,
ack boolean,
PRIMARY KEY (foid, severity, id, category)
)
allowing you to make queries like this (note the equality operation on severity, an IN operation on severity won't work):
select * from testtable2 where foid in (5,6) and severity=5 and id>10;
(tested with cql [cqlsh 4.0.1 | Cassandra 2.0.1 | CQL spec 3.1.1 | Thrift protocol 19.37.0])

Resources