PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Utwórz unikalny indeks w nieunikalnej kolumnie

Indeks może indeksować tylko rzeczywiste wiersze, a nie wiersze zagregowane. Tak więc, jeśli chodzi o pożądany indeks, jedyną opcją jest utworzenie tabeli z unikalnymi wartościami, jak wspomniałeś. Wymuszaj integralność referencyjną za pomocą ograniczenia klucza obcego z data.day do days.day . To może być również najlepsze pod względem wydajności, w zależności od całej sytuacji.

Ponieważ jednak chodzi o wydajność , istnieje alternatywne rozwiązanie:możesz użyć rekurencyjnego CTE do emulacji luźnego skanowania indeksu:

WITH RECURSIVE cte AS (
   (  -- parentheses required
   SELECT day FROM data ORDER BY 1 LIMIT 1
   )
   UNION ALL
   SELECT (SELECT day FROM data WHERE day > c.day ORDER BY 1 LIMIT 1)
   FROM   cte  c
   WHERE  c.day IS NOT NULL  -- exit condition
   )
SELECT day FROM cte;

Nawiasy wokół pierwszego SELECT są wymagane ze względu na dołączony ORDER BY i LIMIT klauzule. Zobacz:

Wymaga to tylko zwykłego indeksu w day .

Istnieją różne warianty, w zależności od rzeczywistych zapytań:

Więcej w mojej odpowiedzi na Twoje dalsze pytanie:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć wartość typu enum w postgresie?

  2. Jak przekazać zestaw wierszy z jednej funkcji do drugiej?

  3. Uzyskaj dostęp do prywatnej bazy danych RDS z innego VPC

  4. Surowe zapytanie Railsowe dla formatu csv, które ma zostać zwrócone przez kontroler

  5. Zezwalaj na wstawianie tylko z poziomu wyzwalacza