← Tutti gli articoli

Il Database 9.7 di Percona aggiunge il punteggio di distanza vettoriale in SQL

Il Database 9.7 di Percona aggiunge il punteggio di distanza vettoriale in SQL

La versione 9.7.2-2 del server di database open-source di Percona consente ora agli sviluppatori di calcolare la similarità vettoriale direttamente in SQL. Le nuove funzioni DISTANCE() e VECTOR_DISTANCE(), annunciate da Catalin Besleaga il 21 settembre 2026, supportano le metriche COSINE, EUCLIDEAN, EUCLIDEAN_SQUARED, MANHATTAN e DOT. Le funzioni di distanza native del server di database upstream sono disponibili solo in HeatWave, un servizio di database cloud gestito sull'infrastruttura di un importante provider cloud aziendale, e coprono solo tre metriche (COSINE, DOT, EUCLIDEAN). Percona porta la stessa capacità a chiunque esegua questo server di database open-source su qualsiasi piattaforma supportata. La funzionalità è stata descritta in un post sul blog di Percona scritto da Catalin Besleaga e revisionato da Dennis Kittrell e Peter Zaitsev.

Un vettore è una lista di numeri di lunghezza fissa, spesso chiamata embedding, prodotta da un modello di machine learning per rappresentare qualcosa come testo, un'immagine, un prodotto o una preferenza utente. Cose simili finiscono con vettori numericamente vicini, quindi calcolare la distanza tra due vettori permette di classificarli o filtrarli per similarità. La versione 9.7 di questo server di database open-source supporta già il tipo di dato VECTOR, insieme alle funzioni TO_VECTOR() e FROM_VECTOR(), per memorizzare gli embedding. Una metrica di distanza è una funzione matematica che trasforma due vettori in un singolo numero che descrive la similarità. Questa release supporta cinque metriche. EUCLIDEAN (L2) è la distanza geometrica in linea retta e funziona bene quando la magnitudine è importante. EUCLIDEAN_SQUARED salta la radice quadrata, mantenendo la stessa classifica ma essendo più veloce per confronti e clausole ORDER BY quando conta solo l'ordinamento. MANHATTAN (L1) è la distanza a griglia, come la distanza del taxi su una griglia cittadina, e può essere più robusta agli outlier in alcune applicazioni. La similarità COSINE misura l'angolo tra due vettori; la distanza coseno è calcolata come 1 meno la similarità coseno, così valori più piccoli significano più simili. DOT è il prodotto scalare grezzo sum(a[i]*b[i]), usato da modelli addestrati specificamente per la similarità del prodotto scalare; l'industria comunemente moltiplica per -1 per invertire la scala, così valori più piccoli significano più simili, allineandosi con le altre metriche.

La firma della funzione è DISTANCE(vettore1, vettore2, metrica). I due argomenti vettoriali possono essere valori di tipo VECTOR o stringhe binarie letterali create con TO_VECTOR(). La metrica deve essere una stringa letterale fissa, case-insensitive, non una colonna o un'espressione. VECTOR_DISTANCE() è un alias con comportamento identico. La funzione restituisce un DOUBLE. Tutte le dimensioni devono corrispondere; se uno degli input è NULL, il risultato è NULL. Per abbinare la metrica al modello, la maggior parte dei modelli di embedding moderni come OpenAI e Cohere sono addestrati con similarità COSINE, quindi usa COSINE. Se la magnitudine ha significato, usa EUCLIDEAN o EUCLIDEAN_SQUARED; in caso di dubbio, controlla la documentazione del modello. Un esempio passo-passo crea una tabella products con una colonna VECTOR(1536), inserisce righe con TO_VECTOR('[0.1, 0.2, 0.3, ..., 0.384]'), e interroga i primi cinque prodotti con DISTANCE(embedding, TO_VECTOR('[0.12, 0.22, 0.32, ..., 0.382]'), 'EUCLIDEAN') ORDER BY similarity_score LIMIT 5. I risultati dell'esempio mostrano il Prodotto B primo con 0.5432109, poi il Prodotto A con 0.9654321, poi il Prodotto C con 0.9876543, ordinati per similarità più alta prima.

Sotto il cofano, l'implementazione usa SIMD (Single Instruction, Multiple Data), una capacità della CPU che esegue la stessa aritmetica su molti numeri contemporaneamente. La matematica delle distanze su centinaia di dimensioni è esattamente l'aritmetica ripetitiva che SIMD accelera. Percona rileva le capacità della CPU all'avvio e seleziona il miglior livello SIMD disponibile, senza necessità di ricompilazione per architettura di destinazione. I livelli sono SSE4.2 o NEON a 128 bit (circa 2-3 volte di accelerazione rispetto allo scalare), AVX2 a 256 bit (circa 4-6 volte), AVX-512F a 512 bit (circa 8-12 volte), SVE2 su ARM (SIMD scalabile che si adatta alla larghezza vettoriale della CPU), e fallback scalare che funziona ovunque. La selezione del kernel consapevole delle dimensioni significa che i calcoli di distanza su vettori piccoli con meno di 16 dimensioni usano il livello più stretto a 128 bit perché l'overhead di impostare registri SIMD più grandi supera il beneficio; i vettori più grandi usano automaticamente il livello più ampio disponibile. I caricamenti non allineati sono usati di proposito: i dati della colonna VECTOR non sono garantiti essere allineati alla linea di cache e non dovrebbero richiedere allineamento. Le CPU moderne hanno throughput identico per caricamenti allineati e non allineati quando i dati sono in cache, quindi tutti i kernel SIMD usano intrinsic di caricamento non allineato per evitare errori su input disallineati senza sacrificare le prestazioni.

DISTANCE() è una funzione scalare che calcola la distanza tra due vettori e restituisce un singolo numero. Senza un indice di nearest neighbor approssimato (ANN), una query come ORDER BY DISTANCE(...) LIMIT k su una tabella grande è una scansione completa della tabella: il database chiama la funzione di distanza su ogni riga e poi ordina. È corretto e accelerato SIMD per riga, ma scala come O(n), non O(log n). Il passo successivo naturale è l'indicizzazione ANN, come HNSW (Hierarchical Navigable Small World) o IVF (Inverted File con raffinamento), che potano lo spazio di ricerca e restituiscono risultati approssimati molto più velocemente. Quella direzione è sulla roadmap. Mentre l'indicizzazione ANN offre velocità, si basa su risultati approssimati; se un'applicazione richiede precisione esatta invece di stime, DISTANCE() è disponibile in questa versione 9.7.2-2 del server di database open-source.

Percona invita gli utenti a provare la funzionalità e condividere feedback: segnalare bug o idee di funzionalità su JIRA, unirsi alla conversazione sul forum della community di Percona, o contattare con domande su utilizzo o prestazioni. Il feedback plasmerà la roadmap, specialmente casi d'uso come strategie specifiche di indici ANN, integrazioni di modelli di embedding e tuning delle prestazioni. Per i team che eseguono questo database open-source in produzione, un servizio di database gestito come AEU Data può gestire backup automatici, storage crittografato, monitoraggio e alta disponibilità, permettendo loro di concentrarsi sulla progettazione di query e indici incluse le nuove funzioni di distanza.

Disponibile anche in: EnglishDeutschShqip