Advertisement
Guest User

Untitled

a guest
Sep 20th, 2021
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DROP SCHEMA IF EXISTS apasc CASCADE;
  2. CREATE SCHEMA apasc;
  3.  
  4. CREATE TABLE apasc.eduinst
  5. (
  6.     eduinst_id UUID NOT NULL,
  7.     CONSTRAINT eduinst_pk PRIMARY KEY (eduinst_id)
  8. );
  9.  
  10. CREATE TABLE apasc.spec
  11. (
  12.     spec_id    UUID NOT NULL,
  13.     eduinst_id UUID NOT NULL,
  14.     CONSTRAINT spec_pk PRIMARY KEY (spec_id),
  15.     CONSTRAINT spec_eduinst_fk FOREIGN KEY (eduinst_id) REFERENCES apasc.eduinst (eduinst_id)
  16. );
  17.  
  18. CREATE SEQUENCE apasc.selection_session_seq START 1 INCREMENT BY 1;
  19. CREATE TABLE apasc.selection_session
  20. (
  21.     selection_session_id INT       NOT NULL DEFAULT nextval('apasc.selection_session_seq')::regclass,
  22.     created              TIMESTAMP NOT NULL DEFAULT current_timestamp,
  23.     CONSTRAINT selection_session_pk PRIMARY KEY (selection_session_id)
  24. );
  25. CREATE INDEX selection_session_created_idx ON apasc.selection_session (created);
  26.  
  27. CREATE TABLE apasc.ses_spec
  28. (
  29.     spec_id              UUID NOT NULL,
  30.     selection_session_id INT  NOT NULL,
  31.     CONSTRAINT ses_spec_pk PRIMARY KEY (spec_id, selection_session_id),
  32.     CONSTRAINT ses_spec_spec_id_fk FOREIGN KEY (spec_id) REFERENCES apasc.spec (spec_id),
  33.     CONSTRAINT ses_spec_selection_session_id_fk FOREIGN KEY (selection_session_id) REFERENCES apasc.selection_session (selection_session_id)
  34. );
  35.  
  36.  
  37. CREATE TABLE apasc.enrollee
  38. (
  39.     user_id              UUID     NOT NULL,
  40.     selection_session_id INT      NOT NULL,
  41.     disabled             BOOLEAN  NOT NULL DEFAULT FALSE,
  42.     selected_target_id   UUID              DEFAULT NULL,
  43.     selection_limit      SMALLINT NOT NULL DEFAULT 3,
  44.     CONSTRAINT enrollee_pk PRIMARY KEY (user_id, selection_session_id),
  45.     CONSTRAINT enrollee_selection_session_id_fk FOREIGN KEY (selection_session_id) REFERENCES apasc.selection_session (selection_session_id),
  46.     CONSTRAINT enrollee_selection_limit_more_than_zero CHECK ( selection_limit >= 0 ),
  47.     CONSTRAINT enrollee_selected_target_id_fk FOREIGN KEY (selected_target_id, selection_session_id) REFERENCES apasc.ses_spec (spec_id, selection_session_id)
  48. );
  49. CREATE INDEX enrollee_selection_idx ON apasc.enrollee (selected_target_id, disabled);
  50.  
  51. CREATE TABLE apasc.enrollee_select
  52. (
  53.     user_id              UUID      NOT NULL,
  54.     selection_session_id INT       NOT NULL,
  55.     spec_id              UUID      NOT NULL,
  56.     status               INT       NOT NULL DEFAULT 0,
  57.     score                INT       NOT NULL DEFAULT 0,
  58.     created              TIMESTAMP NOT NULL DEFAULT current_timestamp,
  59.     CONSTRAINT enrollee_select_pk PRIMARY KEY (user_id, selection_session_id, spec_id),
  60.     CONSTRAINT enrollee_select_user_fk FOREIGN KEY (user_id, selection_session_id) REFERENCES apasc.enrollee (user_id, selection_session_id),
  61.     CONSTRAINT enrollee_select_spec_fk FOREIGN KEY (spec_id, selection_session_id) REFERENCES apasc.ses_spec (spec_id, selection_session_id)
  62. );
  63. CREATE INDEX enrollee_select_enrollee_idx ON apasc.enrollee_select (user_id, selection_session_id);
  64. CREATE INDEX enrollee_select_spec_id_idx ON apasc.enrollee_select (spec_id, selection_session_id);
  65. CREATE INDEX enrollee_select_status_idx ON apasc.enrollee_select (status);
  66. CREATE INDEX enrollee_select_score_idx ON apasc.enrollee_select (score);
  67. CREATE INDEX enrollee_select_created_idx ON apasc.enrollee_select (created);
  68.  
  69.  
  70. DO
  71. $$
  72.     DECLARE
  73.         i    bigint;
  74.         j    BIGINT;
  75.         eiid UUID;
  76.         sid  UUID;
  77.         ssid INT;
  78.     BEGIN
  79.         FOR i IN 1..100
  80.             LOOP
  81.                 eiid := CAST(LPAD(TO_HEX(i), 32, '0') AS UUID);
  82.                 INSERT INTO apasc.eduinst(eduinst_id) VALUES (eiid);
  83.                 FOR j IN 1..100
  84.                     LOOP
  85.                         sid := CAST(LPAD(TO_HEX((i - 1) * 100 + j), 32, '0') AS UUID);
  86.                         INSERT INTO apasc.spec(spec_id, eduinst_id) VALUES (sid, eiid);
  87.                     END LOOP;
  88.             END LOOP;
  89.         FOR ssid IN 1..10
  90.             LOOP
  91.                 INSERT INTO apasc.selection_session(selection_session_id, created) VALUES (ssid, current_timestamp);
  92.                 FOR i IN 1..100
  93.                     LOOP
  94.                         eiid := CAST(LPAD(TO_HEX(i), 32, '0') AS UUID);
  95.                         FOR j IN 1..100
  96.                             LOOP
  97.                                 sid := CAST(LPAD(TO_HEX((i - 1) * 100 + j), 32, '0') AS UUID);
  98.                                 INSERT INTO apasc.ses_spec(spec_id, selection_session_id)
  99.                                 VALUES (sid, ssid);
  100.                             END LOOP;
  101.                     END LOOP;
  102.             END LOOP;
  103.     END;
  104. $$;
  105.  
  106. DO
  107. $$
  108.     DECLARE
  109.         i   bigint;
  110.         j   BIGINT;
  111.         uid UUID;
  112.         sid UUID;
  113.     BEGIN
  114.         FOR i IN 1..1000000
  115.             LOOP
  116.                 uid := CAST(LPAD(TO_HEX(i), 32, '0') AS UUID);
  117.                 INSERT INTO apasc.enrollee(user_id, selection_session_id)
  118.                 VALUES (uid, 1);
  119.                 FOR j IN 1..5
  120.                     LOOP
  121.                         sid = CAST(LPAD(TO_HEX((i - 1 + j) % 10000 + 1), 32, '0') AS UUID);
  122.                         INSERT INTO apasc.enrollee_select(user_id, selection_session_id, spec_id, score)
  123.                         VALUES (uid, 1, sid, floor(random() * 1000)::int);
  124.                     END LOOP;
  125.             END LOOP;
  126.     END;
  127. $$;
  128.  
  129. EXPLAIN ANALYSE
  130. SELECT es.user_id
  131.      , es.score
  132.      , es.selection_session_id
  133.      , es.spec_id
  134.      , e.disabled
  135.      , e.selection_limit
  136.      , e.selected_target_id
  137. FROM apasc.enrollee_select es
  138.          JOIN apasc.enrollee e on e.user_id = es.user_id and e.selection_session_id = es.selection_session_id
  139. WHERE es.spec_id = CAST(LPAD(TO_HEX(1), 32, '0') AS UUID)
  140. ORDER BY es.score DESC, es.created
  141. LIMIT 200;
  142.  
  143. EXPLAIN ANALYSE
  144. INSERT INTO apasc.enrollee_select(user_id, selection_session_id, spec_id)
  145. VALUES (CAST(LPAD(TO_HEX(1), 32, '0') AS UUID), 1, CAST(LPAD(TO_HEX(201), 32, '0') AS UUID));
  146.  
  147. EXPLAIN ANALYSE
  148. UPDATE apasc.enrollee e
  149. SET selected_target_id = CAST(LPAD(TO_HEX(2), 32, '0') AS UUID),
  150.     selection_limit    = selection_limit - 1
  151. WHERE user_id = CAST(LPAD(TO_HEX(1), 32, '0') AS UUID);
  152.  
  153. EXPLAIN ANALYSE
  154. SELECT es.spec_id
  155.      , es.score
  156.      , (SELECT count(*)
  157.         FROM apasc.enrollee_select es2
  158.         WHERE es.selection_session_id = es2.selection_session_id
  159.           AND es.spec_id = es2.spec_id
  160.           AND es.user_id <> es2.user_id
  161.           AND (es.score < es2.score OR (es.score = es2.score AND es.created > es2.created))) + 1 AS place
  162. FROM apasc.enrollee_select es
  163. WHERE es.user_id = CAST(LPAD(TO_HEX(20), 32, '0') AS UUID)
  164.   AND es.selection_session_id = 1;
  165.  
  166. SELECT count(*)
  167. FROM apasc.enrollee_select es
  168. WHERE es.spec_id = CAST(LPAD(TO_HEX(5), 32, '0') AS UUID)
  169. AND es.selection_session_id = 1;
  170.  
  171.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement