Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle по-бърза проверка на припокриване

Не съм сигурен дали искате:

  1. проверете дали ред, който ще вмъкнете, се припокрива с някои от съществуващите редове, или
  2. търсете във всички съществуващи редове и идентифицирайте тези, които се припокриват?

Ако (1), тогава това, което по същество вече правите...

SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;

...ще ви даде припокривания и трябва да е много производителен, при условие че имате съставен индекс, чиито компоненти са срещу указания:{beginRange ASC, endRange DESC} .

Ако (2), тогава можете да използвате прозорец по следния начин:

SELECT *
FROM (
    SELECT
        YOUR_TABLE.*,
        LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
    FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;

Това ще ви даде всеки диапазон, който се припокрива със следващия му диапазон (където значението на „следващ“ е дефинирано в контекста на beginRange поръчване).

Строго казано, това дори не се нуждае от съставен индекс (освен ако не искате покриване ) - просто обикновен индекс на {beginRange} трябва да осигури прилична производителност.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01460:заявено е неосъществено или необосновано преобразуване

  2. Oracle еквивалент на Varargs на Java

  3. datanucleus + jpa + оракул. Странна грешка с несъществуващи таблици

  4. Java:Извикване на съхранена процедура в база данни на Oracle

  5. npm инсталирате oracledb дава грешка:Не може да се намери $OCI_LIB_DIR/libclntsh.dylib