Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rUqAo-00DJb8-Dh for pgsql-performance@arkaria.postgresql.org; Tue, 30 Jan 2024 15:37:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rUqAl-007805-KO for pgsql-performance@arkaria.postgresql.org; Tue, 30 Jan 2024 15:37:15 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rUqAl-0077zx-0s for pgsql-performance@lists.postgresql.org; Tue, 30 Jan 2024 15:37:15 +0000 Received: from mail-wm1-x32e.google.com ([2a00:1450:4864:20::32e]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rUqAi-004Ajm-AB for pgsql-performance@postgresql.org; Tue, 30 Jan 2024 15:37:13 +0000 Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-40fafced20aso3352255e9.0 for ; Tue, 30 Jan 2024 07:37:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cybertec-at.20230601.gappssmtp.com; s=20230601; t=1706629031; x=1707233831; darn=postgresql.org; h=mime-version:user-agent:content-transfer-encoding:autocrypt :references:in-reply-to:date:to:from:subject:message-id:from:to:cc :subject:date:message-id:reply-to; bh=j3rEnxkjGGrBnSZRcUZcVyda8vyh4+xnPNdjc8rqaKc=; b=LTOTlxse/ws+ojQyuMb2HljSc57Bw9m0rT+R+/CxgA/AtxZO8nJcPs3UdPHn+zDn9v Z8fM+8aoXoJhn1FtrpYa60xCQKKQTMHI4P8bOqzplaFg5V7UlWQsaPzDmR5UyKYUXqkK DxgO1d5G4iPsY+QBtkP7hCmgAIR0mMxRCyF4eIryijdpP+vpBIkkwO18elFdfULfma3E KRb538w4EYXoMfXrgLn2E1XniH+AkIuRFxuMRcvBfHLkryoJhMFpV0e8yruGM2DPLb3/ wfzsCOzW1B7gbyM2qnvX58ehMIF4e4pPiCbZYUI1kqotCunQVfzwEtMFv2b3EdbV+8x4 /WZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706629031; x=1707233831; h=mime-version:user-agent:content-transfer-encoding:autocrypt :references:in-reply-to:date:to:from:subject:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=j3rEnxkjGGrBnSZRcUZcVyda8vyh4+xnPNdjc8rqaKc=; b=uZUkpJi/CD7he6RmJR+64+Pj2RKkLGv1LcbeJNj2ojkOeiMxiGdNY4/Au+qeiPolJK Qo0dZAPQRpJHgS5sfjXv79iNwrKFkqJKEKxdC83/RYsjEH3Zc+yYuqOhfNv5VJ0Grs7S +v+iom2s1jZZxalLtkirFILvpO5UNcGL2MdJXGDcvQ23pq3jfOBSazfMgsQC+TsuktQr Fq69EWh3ce/38D1+87gfy+Lll+B4Iu7rTBTaBPhOirCXMMzTWa5w2TUShctPxjGJJpXS dwladWfNHqEYLoI8whc7phGXTxYhndAJSKjuAxzCCuvyjpG6S3REPwM65cqo/GLFN848 In3Q== X-Gm-Message-State: AOJu0YyQyUpsRDy4u6D/fgvaeZeLRnWHiHw1rgkF7XdJFRgdOvU71iit hyHWaKwDXp+4YAf8oaCEyW4Mb8UhmFiuSrN3p3sw290Mt24YIlnleYc5d3mU+JY= X-Google-Smtp-Source: AGHT+IHuCCtL+YMCu54ewmQ1f5zozpU0UZiFvKsvg9mRhHCKbYG424zwwDA1bVtGY8SNGRPjQhXCpg== X-Received: by 2002:a1c:4b10:0:b0:40e:6922:7960 with SMTP id y16-20020a1c4b10000000b0040e69227960mr8309339wma.29.1706629030736; Tue, 30 Jan 2024 07:37:10 -0800 (PST) X-Forwarded-Encrypted: i=0; AJvYcCVgrmYRrfS+OdRJVxP5oRRGIicXwkp9K0DrH/ENWghA8r+LXSolZAkLh0s5htQJi7p/owQwoMtm4ZtEphTLbUGqkm/txr6ylRGSZyxKoZ/f/w== Received: from localhost.localdomain ([2001:871:260:9ef3:ad95:e6fd:5e58:3393]) by smtp.gmail.com with ESMTPSA id t20-20020a05600c199400b0040ef702a338sm6327746wmq.25.2024.01.30.07.37.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jan 2024 07:37:10 -0800 (PST) Message-ID: <40701055b4405ad3bf64467517401c8a44e41973.camel@cybertec.at> Subject: Re: Slow query in table where many rows were deleted. VACUUM FULL fixes it From: Laurenz Albe To: Pavlos Kallis , pgsql-performance@postgresql.org Date: Tue, 30 Jan 2024 16:37:09 +0100 In-Reply-To: References: Autocrypt: addr=laurenz.albe@cybertec.at; prefer-encrypt=mutual; keydata=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 +AnW5l0HsQcY9ntFL/zEBOaonjdJf Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.50.3 (3.50.3-1.fc39) MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Tue, 2024-01-30 at 11:40 +0200, Pavlos Kallis wrote: > I have the following table: >=20 > CREATE TABLE IF NOT EXISTS public.shortened_url > ( > =C2=A0 =C2=A0 id character varying(12) COLLATE pg_catalog."default" NOT N= ULL, > =C2=A0 =C2=A0 created_at timestamp without time zone, > =C2=A0 =C2=A0 expires_at timestamp without time zone, > =C2=A0 =C2=A0 url text COLLATE pg_catalog."default" NOT NULL, > =C2=A0 =C2=A0 CONSTRAINT shortened_url_pkey PRIMARY KEY (id) > ) >=20 > The table contains only the following index on PRIMARY KEY: >=20 > CREATE UNIQUE INDEX IF NOT EXISTS shortened_url_pkey > =C2=A0 =C2=A0 ON public.shortened_url USING btree > =C2=A0 =C2=A0 (id COLLATE pg_catalog."default" ASC NULLS LAST) > =C2=A0 =C2=A0 TABLESPACE pg_default; >=20 > This table has approximately 5 million rows of expired URLs (expires_at <= now()), and 5 thousand rows of non-expired URLs (expires_at > now()) >=20 > I deleted all expired URLs with this query: >=20 > DELETE FROM shortened_url WHERE expires_at < now(). >=20 > Then, I tried to query the table for expired URLs: >=20 > SELECT * FROM shortened_url WHERE expires_at < now(); >=20 > This query was very slow. It took around 1-2 minutes to run, while it had= to fetch only 5000 rows (the non-expired URLs, since the other ones were d= eleted). >=20 > After that, I tried to run VACUUM ANALYZE and REINDEX to the table. > The query was still slow. >=20 > Finally, I ran VACUUM FULL and re-executed the query. Only then, it start= ed running fast (1-2 seconds). >=20 > Do you have observed a similar behavior with VACUUM ANALYZE / VACUUM FULL= and why this can happen?=C2=A0 > Is this because data is compacted after VACUUM FULL and sequential disk r= eads are faster?=C2=A0 > Shouldn't VACUUM ANALYZE reclaim the disk space and make the query run fa= st? > Is this because RDS might do some magic? Is it something I am missing? There are too many unknowns here. Please enable "track_io_timing" and send= us the output of EXPLAIN (ANALYZE, BUFFERS) for the slow statements. One theory could be that there was a long running transaction or something = else that prevented VACUUM from cleaning up. For that, the output of "VACUUM (VERBOSE) shortened_url" would be interesting. > Additional details > PostgreSQL version: 14.7 on db.t3.micro RDS > PG configuration: Default of RDS We can only speak about real PostgreSQL... Yours, Laurenz Albe