Skip to content

Instantly share code, notes, and snippets.

@choplin
Last active December 22, 2015 03:49
Show Gist options
  • Select an option

  • Save choplin/6412952 to your computer and use it in GitHub Desktop.

Select an option

Save choplin/6412952 to your computer and use it in GitHub Desktop.
ここの記述が怪しいという話 http://d.hatena.ne.jp/Sikushima/20130828/1377663112
-- バージョン
SELECT version();
version
-----------------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 9.2.0 on x86_64-apple-darwin11.4.2, compiled by Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn), 64-bit
(1 row)
-- ランダム文字
CREATE OR REPLACE FUNCTION random_char() RETURNS text AS $$
SELECT chr((round((random() * 25)::numeric, 0))::int + 97);
$$ LANGUAGE SQL VOLATILE;
-- ランダム文字列
CREATE OR REPLACE FUNCTION random_text(int) RETURNS text AS $$
SELECT
string_agg(random_char(), '')
FROM
generate_series(1, $1)
$$ LANGUAGE SQL VOLATILE;
-- カラオケ
-- 曲名はランダムな10文字
CREATE TABLE karaoke (
id int,
name text
);
INSERT INTO karaoke
SELECT
i,
random_text(10)
FROM
generate_series(1,100000) t(i)
;
ANALYZE karaoke;
-- 曲名リスト
-- karaokeからランダム10件
CREATE TABLE list (
name text
);
INSERT INTO list
SELECT
name
FROM
karaoke
ORDER BY
random()
LIMIT
10
;
ANALYZE list;
-- 1
EXPLAIN SELECT * FROM karaoke WHERE name IN ('pchamwvbgw','uqwywbmvdf','knlokuffsp','efoprrpdfx','ibsguemtcj','wfbbqnvjpp','nqcrctclwp','ghrrxihlks','utqipdgehy','uaywepuxxf');
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on karaoke (cost=0.00..2791.00 rows=10 width=15)
Filter: (name = ANY ('{pchamwvbgw,uqwywbmvdf,knlokuffsp,efoprrpdfx,ibsguemtcj,wfbbqnvjpp,nqcrctclwp,ghrrxihlks,utqipdgehy,uaywepuxxf}'::text[]))
(2 rows)
-- 2
EXPLAIN SELECT * FROM karaoke WHERE
name = 'pchamwvbgw'
OR name = 'uqwywbmvdf'
OR name = 'knlokuffsp'
OR name = 'efoprrpdfx'
OR name = 'ibsguemtcj'
OR name = 'wfbbqnvjpp'
OR name = 'nqcrctclwp'
OR name = 'ghrrxihlks'
OR name = 'utqipdgehy'
OR name = 'uaywepuxxf'
;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on karaoke (cost=0.00..4041.00 rows=10 width=15)
Filter: ((name = 'pchamwvbgw'::text) OR (name = 'uqwywbmvdf'::text) OR (name = 'knlokuffsp'::text) OR (name = 'efoprrpdfx'::text) OR (name = 'ibsguemtcj'::text) OR (name = 'wfbbqnvjpp'::text) OR (name = 'nqcrctclwp'::text) OR (name = 'ghrrxihlks'::text) OR (name = 'utqipdgehy'::text) OR (name = 'uaywepuxxf'::text))
(2 rows)
-- 3
EXPLAIN SELECT * FROM karaoke WHERE name = 'pchamwvbgw'
UNION ALL SELECT * FROM karaoke WHERE name = 'uqwywbmvdf'
UNION ALL SELECT * FROM karaoke WHERE name = 'knlokuffsp'
UNION ALL SELECT * FROM karaoke WHERE name = 'efoprrpdfx'
UNION ALL SELECT * FROM karaoke WHERE name = 'ibsguemtcj'
UNION ALL SELECT * FROM karaoke WHERE name = 'wfbbqnvjpp'
UNION ALL SELECT * FROM karaoke WHERE name = 'nqcrctclwp'
UNION ALL SELECT * FROM karaoke WHERE name = 'ghrrxihlks'
UNION ALL SELECT * FROM karaoke WHERE name = 'utqipdgehy'
UNION ALL SELECT * FROM karaoke WHERE name = 'uaywepuxxf'
;
QUERY PLAN
-----------------------------------------------------------------------
Result (cost=0.00..17910.10 rows=10 width=15)
-> Append (cost=0.00..17910.10 rows=10 width=15)
-> Seq Scan on karaoke (cost=0.00..1791.00 rows=1 width=15)
Filter: (name = 'pchamwvbgw'::text)
-> Seq Scan on karaoke (cost=0.00..1791.00 rows=1 width=15)
Filter: (name = 'uqwywbmvdf'::text)
-> Seq Scan on karaoke (cost=0.00..1791.00 rows=1 width=15)
Filter: (name = 'knlokuffsp'::text)
-> Seq Scan on karaoke (cost=0.00..1791.00 rows=1 width=15)
Filter: (name = 'efoprrpdfx'::text)
-> Seq Scan on karaoke (cost=0.00..1791.00 rows=1 width=15)
Filter: (name = 'ibsguemtcj'::text)
-> Seq Scan on karaoke (cost=0.00..1791.00 rows=1 width=15)
Filter: (name = 'wfbbqnvjpp'::text)
-> Seq Scan on karaoke (cost=0.00..1791.00 rows=1 width=15)
Filter: (name = 'nqcrctclwp'::text)
-> Seq Scan on karaoke (cost=0.00..1791.00 rows=1 width=15)
Filter: (name = 'ghrrxihlks'::text)
-> Seq Scan on karaoke (cost=0.00..1791.00 rows=1 width=15)
Filter: (name = 'utqipdgehy'::text)
-> Seq Scan on karaoke (cost=0.00..1791.00 rows=1 width=15)
Filter: (name = 'uaywepuxxf'::text)
(22 rows)
-- 4
EXPLAIN SELECT * FROM karaoke WHERE name IN (SELECT name FROM list);
QUERY PLAN
----------------------------------------------------------------------
Hash Semi Join (cost=54.78..1895.15 rows=1990 width=15)
Hash Cond: (karaoke.name = list.name)
-> Seq Scan on karaoke (cost=0.00..1541.00 rows=100000 width=15)
-> Hash (cost=29.90..29.90 rows=1990 width=11)
-> Seq Scan on list (cost=0.00..29.90 rows=1990 width=11)
(5 rows)
-- exists
EXPLAIN SELECT * FROM karaoke k WHERE EXISTS (SELECT * FROM list l WHERE k.name = l.name);
QUERY PLAN
------------------------------------------------------------------------
Hash Semi Join (cost=54.78..1895.15 rows=1990 width=15)
Hash Cond: (k.name = l.name)
-> Seq Scan on karaoke k (cost=0.00..1541.00 rows=100000 width=15)
-> Hash (cost=29.90..29.90 rows=1990 width=11)
-> Seq Scan on list l (cost=0.00..29.90 rows=1990 width=11)
(5 rows)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment