我有一个表,其中有一个 jsonb 列,其中包含一个对象数组。
每一行看起来都是这样。
[{grade: 'A', subject: 'MATH'}, {grade: 'B', subject: 'PHY'}...]
Run Code Online (Sandbox Code Playgroud)
现在通过这篇文章查询它/sf/answers/2141445351/。
问题来了,完成查询所有具有grade
IN (A, B, C) 的学生的计数至少需要 2.4 秒。
我想得到一些关于索引的帮助,因为我尝试过的索引没有做任何事情。
DROP INDEX idx_subjects_subject;
DROP INDEX idx_subjects_grade;
CREATE INDEX idx_subjects_subject ON results USING GIN((subjects-> 'subject'));
CREATE INDEX idx_subjects_grade ON results USING GIN((subjects-> 'grade'));
Run Code Online (Sandbox Code Playgroud)
还做了(单独):
DROP INDEX idx_subjects_standard;
CREATE INDEX idx_subjects_standard ON results USING GIN(subjects);
Run Code Online (Sandbox Code Playgroud)
我是这样问他们的。
SELECT COUNT(*)
FROM results
WHERE EXISTS
(
SELECT 1
FROM jsonb_array_elements(subjects) AS j(data)
WHERE (data #>> '{subject}') LIKE '%MATH%'
AND
(data …
Run Code Online (Sandbox Code Playgroud)