Heim > Datenbank > MySQL-Tutorial > Warum ist SELECT DISTINCT bei einer Tabelle mit einem zusammengesetzten Primärschlüssel in PostgreSQL langsam und wie kann es optimiert werden?

Warum ist SELECT DISTINCT bei einer Tabelle mit einem zusammengesetzten Primärschlüssel in PostgreSQL langsam und wie kann es optimiert werden?

Patricia Arquette
Freigeben: 2025-01-07 18:27:40
Original
761 Leute haben es durchsucht

Bei Tabellen, die zusammengesetzte Primärschlüssel in PostgreSQL verwenden SELECT DISTINCTGründe für langsame Abfragegeschwindigkeit und Optimierungsmethoden

Why is SELECT DISTINCT Slow on a Table with a Composite Primary Key in PostgreSQL, and How Can It Be Optimized?

In einer PostgreSQL-Datenbank SELECT DISTINCT hängt die Ausführungsgeschwindigkeit einer Abfrage von der Tabellenstruktur und der Datenverteilung ab. Obwohl die tickers-Spalte in der product_id-Tabelle Teil eines zusammengesetzten Primärschlüssels ist und daher darauf indiziert ist, führt eine Abfrage, die SELECT DISTINCT product_id FROM tickers verwendet, um eindeutiges product_id zu erhalten, standardmäßig einen sequentiellen Scan durch.

Gründe für langsame Leistung

Der Hauptgrund für die langsame Leistung von

ist, dass die Tabelle doppelte Werte von product_id enthält. Das bedeutet, dass PostgreSQL für jedes abgerufene eindeutige product_id die gesamte Tabelle scannen muss, um sicherzustellen, dass keine Duplikate vorhanden sind.

Lösung: Index-Skip-Scan simulieren

Da PostgreSQL Index-Skip-Scans noch nicht nativ unterstützt, können Sie rekursive CTEs (Common Table Expressions) verwenden, um dieses Verhalten zu simulieren. Dieser CTE ruft iterativ Duplikate ab und verwirft sie, wodurch effektiv alle bis auf eine Instanz jedes eindeutigen product_id herausgefiltert werden.

Verbesserte Lösung

<code class="language-sql">WITH RECURSIVE cte AS (
   (   -- 括号必需
   SELECT product_id
   FROM   tickers
   ORDER  BY 1
   LIMIT  1
   )
   UNION ALL
   SELECT l.*
   FROM   cte c
   CROSS  JOIN LATERAL (
      SELECT product_id
      FROM   tickers t
      WHERE  t.product_id > c.product_id  -- 横向引用
      ORDER  BY 1
      LIMIT  1
      ) l
   )
TABLE  cte;</code>
Nach dem Login kopieren

Diese Abfrage verwendet einen horizontalen Join, um die sortierte Tabelle zu durchlaufen und mithilfe von orderBy eindeutige product_id-Werte abzurufen.

Fazit

Die Ausführungszeit von SELECT DISTINCT product_id-Abfragen kann erheblich verbessert werden, indem ein Index-Skip-Scan mithilfe der CTE-Methode simuliert wird, wodurch die Zeit reduziert wird, die zum Abrufen eindeutiger tickerss aus der product_id-Tabelle erforderlich ist.

Das obige ist der detaillierte Inhalt vonWarum ist SELECT DISTINCT bei einer Tabelle mit einem zusammengesetzten Primärschlüssel in PostgreSQL langsam und wie kann es optimiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage