sql >> Databáze >  >> RDS >> Mysql

Dotaz SQL, který hledá řádky splňující sloupec1 <=X <=sloupec2, je velmi pomalý

Našel jsem řešení, které závisí na vlastnostech dat v tabulce. Raději bych měl obecnější řešení, které nezávisí na aktuálních datech, ale prozatím je to to nejlepší, co mám.

Problém s původním dotazem:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;

je, že spuštění může vyžadovat skenování velkého procenta položek v FirstX ,LastX ,P index při první podmínce FirstX <= ? je splněno velkým procentem řádků.

Co jsem udělal, abych zkrátil dobu provádění, je pozorovat, že LastX-FirstX je relativně malý.

Spustil jsem dotaz:

SELECT MAX(LastX-FirstX) FROM SomeTable;

a dostal 4200000 .

To znamená, že FirstX >= LastX – 4200000 pro všechny řádky v tabulce.

Abychom tedy uspokojili LastX >= ? , musíme také splnit FirstX >= ? – 4200000 .

Můžeme tedy do dotazu přidat podmínku takto:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;

V příkladu, který jsem testoval v otázce, byl počet zpracovaných položek indexu snížen z 2104820 do 18 a doba běhu byla zkrácena z 0,563 sekund na 0,0003 sekund .

Testoval jsem nový dotaz se stejným 120000 hodnoty X . Výstup byl totožný se starým dotazem. Čas se zkrátil z více než 10 hodin5,5 minuty , která je více než 100krát rychlejší .



  1. Jak vyladit nebo otestovat výkon kódu PLSQL v Oracle D2k Forms

  2. Jak vybrat více řádků z mysql jedním dotazem a použít je v php

  3. Jak opravit nový datový typ, který způsobuje problémy MS Access

  4. Oracle Rozdíly mezi NVL a Coalesce