| 125 | | === 2. Анализа на поглед 2, најактивни корисници на платформата според бројот на слушања во изминатите 30 дена === |
| | 124 | === Влијание на индексот врз insert/update |
| | 125 | |
| | 126 | Тестирани прашалници: |
| | 127 | {{{ |
| | 128 | INSERT INTO follows (follower_user_id, followed_user_id) VALUES (185508, 1); |
| | 129 | |
| | 130 | UPDATE follows SET followed_user_id = 1 WHERE id = 1; |
| | 131 | }}} |
| | 132 | |
| | 133 | **Без индекс - insert 1.120 ms, update 0.668 ms** |
| | 134 | |
| | 135 | {{{ |
| | 136 | Insert on follows (cost=0.00..0.02 rows=0 width=0) (actual time=0.332..0.332 rows=0 loops=1) |
| | 137 | -> Result (cost=0.00..0.02 rows=1 width=32) (actual time=0.049..0.049 rows=1 loops=1) |
| | 138 | Planning Time: 0.108 ms |
| | 139 | Trigger for constraint follows_follower_user_id_fkey: time=0.670 calls=1 |
| | 140 | Trigger for constraint follows_followed_user_id_fkey: time=0.097 calls=1 |
| | 141 | Execution Time: 1.120 ms |
| | 142 | }}} |
| | 143 | {{{ |
| | 144 | Update on follows (cost=0.41..8.43 rows=0 width=0) (actual time=0.182..0.182 rows=0 loops=1) |
| | 145 | -> Index Scan using follows_pkey on follows (cost=0.41..8.43 rows=1 width=14) (actual time=0.028..0.029 rows=1 loops=1) |
| | 146 | Index Cond: (id = 1) |
| | 147 | Planning Time: 0.378 ms |
| | 148 | Trigger for constraint follows_followed_user_id_fkey: time=0.410 calls=1 |
| | 149 | Execution Time: 0.668 ms |
| | 150 | }}} |
| | 151 | |
| | 152 | **Со индекс - insert 0.541 ms, update 0.761 ms** |
| | 153 | |
| | 154 | {{{ |
| | 155 | Insert on follows (cost=0.00..0.02 rows=0 width=0) (actual time=0.172..0.172 rows=0 loops=1) |
| | 156 | -> Result (cost=0.00..0.02 rows=1 width=32) (actual time=0.029..0.029 rows=1 loops=1) |
| | 157 | Planning Time: 0.072 ms |
| | 158 | Trigger for constraint follows_follower_user_id_fkey: time=0.326 calls=1 |
| | 159 | Trigger for constraint follows_followed_user_id_fkey: time=0.030 calls=1 |
| | 160 | Execution Time: 0.541 ms |
| | 161 | }}} |
| | 162 | {{{ |
| | 163 | Update on follows (cost=0.42..8.44 rows=0 width=0) (actual time=0.205..0.205 rows=0 loops=1) |
| | 164 | -> Index Scan using follows_pkey on follows (cost=0.42..8.44 rows=1 width=14) (actual time=0.028..0.029 rows=1 loops=1) |
| | 165 | Index Cond: (id = 1) |
| | 166 | Planning Time: 0.506 ms |
| | 167 | Trigger for constraint follows_followed_user_id_fkey: time=0.472 calls=1 |
| | 168 | Execution Time: 0.761 ms |
| | 169 | }}} |
| | 170 | |
| | 171 | |
| | 172 | == 2. Анализа на поглед 2, најактивни корисници на платформата според бројот на слушања во изминатите 30 дена == |
| 208 | | |
| 209 | | |
| 210 | | === 3. Анализа на поглед 3, рангирање на песни по нивните просечни оценки и бројот на вкупни оценки, соодветно === |
| | 255 | Индексот не го бришеме бидејќи ке биде корисен и за други прашалници понатаму низ анализата. |
| | 256 | |
| | 257 | === Влијание на индексот врз insert/update |
| | 258 | |
| | 259 | Тестирани прашалници: |
| | 260 | {{{ |
| | 261 | INSERT INTO song_streams (playback_session_id, song_id, streamed_at, user_id) |
| | 262 | VALUES (362881, 518859, now(), 910877); |
| | 263 | |
| | 264 | UPDATE song_streams SET user_id = 910878 WHERE id = 1; |
| | 265 | }}} |
| | 266 | |
| | 267 | **Без индекс - insert 1.343 ms, update 0.372 ms** |
| | 268 | |
| | 269 | {{{ |
| | 270 | Insert on song_streams (cost=0.00..0.02 rows=0 width=0) (actual time=0.390..0.391 rows=0 loops=1) |
| | 271 | -> Result (cost=0.00..0.02 rows=1 width=40) (actual time=0.056..0.057 rows=1 loops=1) |
| | 272 | Planning Time: 0.076 ms |
| | 273 | Trigger for constraint song_streams_playback_session_id_fkey: time=0.517 calls=1 |
| | 274 | Trigger for constraint song_streams_song_id_fkey: time=0.412 calls=1 |
| | 275 | Execution Time: 1.343 ms |
| | 276 | }}} |
| | 277 | {{{ |
| | 278 | Update on song_streams (cost=0.43..8.45 rows=0 width=0) (actual time=0.252..0.253 rows=0 loops=1) |
| | 279 | -> Index Scan using song_streams_pkey on song_streams (cost=0.43..8.45 rows=1 width=14) (actual time=0.037..0.042 rows=1 loops=1) |
| | 280 | Index Cond: (id = 1) |
| | 281 | Planning Time: 0.586 ms |
| | 282 | Execution Time: 0.372 ms |
| | 283 | }}} |
| | 284 | |
| | 285 | **Со индекс - insert 0.632 ms, update 0.323 ms** |
| | 286 | |
| | 287 | {{{ |
| | 288 | Insert on song_streams (cost=0.00..0.02 rows=0 width=0) (actual time=0.198..0.198 rows=0 loops=1) |
| | 289 | -> Result (cost=0.00..0.02 rows=1 width=40) (actual time=0.030..0.030 rows=1 loops=1) |
| | 290 | Planning Time: 0.049 ms |
| | 291 | Trigger for constraint song_streams_playback_session_id_fkey: time=0.237 calls=1 |
| | 292 | Trigger for constraint song_streams_song_id_fkey: time=0.184 calls=1 |
| | 293 | Execution Time: 0.632 ms |
| | 294 | }}} |
| | 295 | {{{ |
| | 296 | Update on song_streams (cost=0.43..8.45 rows=0 width=0) (actual time=0.246..0.246 rows=0 loops=1) |
| | 297 | -> Index Scan using song_streams_pkey on song_streams (cost=0.43..8.45 rows=1 width=14) (actual time=0.040..0.042 rows=1 loops=1) |
| | 298 | Index Cond: (id = 1) |
| | 299 | Planning Time: 0.474 ms |
| | 300 | Execution Time: 0.323 ms |
| | 301 | }}} |
| | 302 | |
| | 303 | == 3. Анализа на поглед 3, рангирање на песни по нивните просечни оценки и бројот на вкупни оценки, соодветно == |
| 673 | | Планерот го користи и претходно креираниот индекс {{{idx_follows_followed_user_id}}}. Индексите го забрзаа извршувањето за речиси 100%, па заклучуваме дека нема потреба од дополнителна оптимизација. |
| 674 | | |
| 675 | | |
| 676 | | === 7. Анализа на поглед 7, детални информации за секоја песна |
| | 778 | Планерот го користи и претходно креираниот индекс }}}idx_follows_followed_user_id}}}. Индексите го забрзаа извршувањето за речиси 100%, па заклучуваме дека нема потреба од дополнителна оптимизација. |
| | 779 | |
| | 780 | === Влијание на индексот врз insert/update |
| | 781 | |
| | 782 | Тестирани прашалници: |
| | 783 | {{{ |
| | 784 | INSERT INTO songs (title, visibility, owner_artist_id, published_by_artist_id, genre) |
| | 785 | VALUES ('benchmark', 'PUBLIC', 494, 494, 'rock'); |
| | 786 | |
| | 787 | UPDATE songs SET owner_artist_id = (owner_artist_id % 100000) + 1 WHERE id = 1; |
| | 788 | }}} |
| | 789 | |
| | 790 | **Без индекс - insert 1.138 ms, update 0.883 ms** |
| | 791 | |
| | 792 | {{{ |
| | 793 | Insert on songs (cost=0.00..0.01 rows=0 width=0) (actual time=0.482..0.482 rows=0 loops=1) |
| | 794 | -> Result (cost=0.00..0.01 rows=1 width=1202) (actual time=0.044..0.045 rows=1 loops=1) |
| | 795 | Planning Time: 0.084 ms |
| | 796 | Trigger for constraint songs_owner_artist_id_fkey: time=0.524 calls=1 |
| | 797 | Trigger for constraint songs_published_by_artist_id_fkey: time=0.081 calls=1 |
| | 798 | Trigger for constraint songs_published_by_label_id_fkey: time=0.024 calls=1 |
| | 799 | Execution Time: 1.138 ms |
| | 800 | }}} |
| | 801 | {{{ |
| | 802 | Update on songs (cost=0.43..8.45 rows=0 width=0) (actual time=0.357..0.357 rows=0 loops=1) |
| | 803 | -> Index Scan using songs_pkey on songs (cost=0.43..8.45 rows=1 width=14) (actual time=0.032..0.035 rows=1 loops=1) |
| | 804 | Index Cond: (id = 1) |
| | 805 | Planning Time: 0.481 ms |
| | 806 | Trigger for constraint songs_owner_artist_id_fkey: time=0.431 calls=1 |
| | 807 | Execution Time: 0.883 ms |
| | 808 | }}} |
| | 809 | |
| | 810 | **Со индекс - insert 0.560 ms, update 0.814 ms** |
| | 811 | |
| | 812 | {{{ |
| | 813 | Insert on songs (cost=0.00..0.01 rows=0 width=0) (actual time=0.205..0.205 rows=0 loops=1) |
| | 814 | -> Result (cost=0.00..0.01 rows=1 width=1202) (actual time=0.018..0.019 rows=1 loops=1) |
| | 815 | Planning Time: 0.043 ms |
| | 816 | Trigger for constraint songs_owner_artist_id_fkey: time=0.240 calls=1 |
| | 817 | Trigger for constraint songs_published_by_artist_id_fkey: time=0.079 calls=1 |
| | 818 | Trigger for constraint songs_published_by_label_id_fkey: time=0.021 calls=1 |
| | 819 | Execution Time: 0.560 ms |
| | 820 | }}} |
| | 821 | {{{ |
| | 822 | Update on songs (cost=0.43..8.45 rows=0 width=0) (actual time=0.342..0.343 rows=0 loops=1) |
| | 823 | -> Index Scan using songs_pkey on songs (cost=0.43..8.45 rows=1 width=14) (actual time=0.031..0.034 rows=1 loops=1) |
| | 824 | Index Cond: (id = 1) |
| | 825 | Planning Time: 0.483 ms |
| | 826 | Trigger for constraint songs_owner_artist_id_fkey: time=0.386 calls=1 |
| | 827 | Execution Time: 0.814 ms |
| | 828 | }}} |
| | 829 | |
| | 830 | === Влијание на индексот врз insert/update |
| | 831 | |
| | 832 | Тестирани прашалници: |
| | 833 | {{{ |
| | 834 | INSERT INTO artist_labels (artist_id, label_id, active, start_date) |
| | 835 | VALUES (494, 1, true, DATE '2020-01-01'); |
| | 836 | |
| | 837 | UPDATE artist_labels SET label_id = (label_id % 375) + 1 WHERE id = 1; |
| | 838 | }}} |
| | 839 | |
| | 840 | **Без индекс - insert 1.219 ms, update 0.608 ms** |
| | 841 | |
| | 842 | {{{ |
| | 843 | Insert on artist_labels (cost=0.00..0.01 rows=0 width=0) (actual time=0.330..0.331 rows=0 loops=1) |
| | 844 | -> Result (cost=0.00..0.01 rows=1 width=33) (actual time=0.040..0.041 rows=1 loops=1) |
| | 845 | Planning Time: 0.082 ms |
| | 846 | Trigger for constraint artist_labels_artist_id_fkey: time=0.601 calls=1 |
| | 847 | Trigger for constraint artist_labels_label_id_fkey: time=0.267 calls=1 |
| | 848 | Execution Time: 1.219 ms |
| | 849 | }}} |
| | 850 | {{{ |
| | 851 | Update on artist_labels (cost=0.41..8.44 rows=0 width=0) (actual time=0.176..0.177 rows=0 loops=1) |
| | 852 | -> Index Scan using artist_labels_pkey on artist_labels (cost=0.41..8.44 rows=1 width=14) (actual time=0.030..0.031 rows=1 loops=1) |
| | 853 | Index Cond: (id = 1) |
| | 854 | Planning Time: 0.476 ms |
| | 855 | Trigger for constraint artist_labels_label_id_fkey: time=0.342 calls=1 |
| | 856 | Execution Time: 0.608 ms |
| | 857 | }}} |
| | 858 | |
| | 859 | **Со индекс - insert 1.334 ms, update 0.596 ms** |
| | 860 | |
| | 861 | {{{ |
| | 862 | Insert on artist_labels (cost=0.00..0.01 rows=0 width=0) (actual time=0.384..0.385 rows=0 loops=1) |
| | 863 | -> Result (cost=0.00..0.01 rows=1 width=33) (actual time=0.036..0.037 rows=1 loops=1) |
| | 864 | Planning Time: 0.078 ms |
| | 865 | Trigger for constraint artist_labels_artist_id_fkey: time=0.655 calls=1 |
| | 866 | Trigger for constraint artist_labels_label_id_fkey: time=0.276 calls=1 |
| | 867 | Execution Time: 1.334 ms |
| | 868 | }}} |
| | 869 | {{{ |
| | 870 | Update on artist_labels (cost=0.41..8.44 rows=0 width=0) (actual time=0.182..0.182 rows=0 loops=1) |
| | 871 | -> Index Scan using artist_labels_pkey on artist_labels (cost=0.41..8.44 rows=1 width=14) (actual time=0.029..0.030 rows=1 loops=1) |
| | 872 | Index Cond: (id = 1) |
| | 873 | Planning Time: 0.538 ms |
| | 874 | Trigger for constraint artist_labels_label_id_fkey: time=0.318 calls=1 |
| | 875 | Execution Time: 0.596 ms |
| | 876 | }}} |
| | 877 | |
| | 878 | |
| | 879 | == 7. Анализа на поглед 7, детални информации за секоја песна |
| 843 | | Бидејќи сепак имаме секвенцијално скенирање на табелата {{{song_streams}}} поради групирањето на слушања по песна, дополнително оптимизираме со материјализиран погледи: |
| 844 | | |
| 845 | | {{{ |
| 846 | | create materialized view song_stream_counts_mv as |
| 847 | | select |
| | 1046 | Бидејќи сепак имаме секвенцијално скенирање на табелата }}}song_streams}}} поради групирањето на слушања по песна и ова не може да се оптимизира со индекси, оптимизираме со материјализиран погледи, а индексите од горе ги бришеме: |
| | 1047 | |
| | 1048 | {{{ |
| | 1049 | CREATE MATERIALIZED VIEW song_stream_counts_mv AS |
| | 1050 | WITH live AS ( |
| | 1051 | SELECT ss.song_id, count(*) AS streams |
| | 1052 | FROM song_streams ss |
| | 1053 | WHERE ss.streamed_at >= COALESCE( |
| | 1054 | (SELECT max(partition_month) + interval '1 month' |
| | 1055 | FROM song_stream_sealed_partitions), |
| | 1056 | timestamp '-infinity' |
| | 1057 | ) |
| | 1058 | GROUP BY ss.song_id |
| | 1059 | ) |
| | 1060 | SELECT song_id, SUM(streams) AS streams |
| | 1061 | FROM ( |
| | 1062 | SELECT song_id, streams FROM song_stream_counts_archive |
| | 1063 | UNION ALL |
| | 1064 | SELECT song_id, streams FROM live |
| | 1065 | ) t |
| | 1066 | GROUP BY song_id; |
| | 1067 | |
| | 1068 | CREATE MATERIALIZED VIEW song_playlist_counts_mv AS |
| | 1069 | SELECT |
| 849 | | count(*) as streams |
| 850 | | from song_streams |
| 851 | | group by song_id; |
| 852 | | |
| 853 | | |
| 854 | | create materialized view song_playlist_counts_mv as |
| 855 | | select |
| 856 | | song_id, |
| 857 | | count(*) as saved_in_playlists |
| 858 | | from playlist_tracks |
| 859 | | group by song_id; |
| 860 | | |
| 861 | | |
| 862 | | create or replace view song_detailed_info_view_mvs as |
| 863 | | select |
| 864 | | s.title as title, |
| 865 | | a.display_name as artist_name, |
| 866 | | coalesce(l.name, 'SOLO') as label_name, |
| 867 | | coalesce(sc.streams, 0) as streams, |
| 868 | | coalesce(alb.title, 'SINGLE') as album_title, |
| 869 | | coalesce(pc.saved_in_playlists, 0) as saved_in_playlists, |
| | 1071 | COUNT(*) AS saved_in_playlists |
| | 1072 | FROM playlist_tracks |
| | 1073 | GROUP BY song_id; |
| | 1074 | |
| | 1075 | |
| | 1076 | CREATE OR REPLACE VIEW songs_details AS |
| | 1077 | SELECT |
| | 1078 | s.title AS title, |
| | 1079 | a.display_name AS artist_name, |
| | 1080 | COALESCE(l.name, 'SOLO') AS label_name, |
| | 1081 | COALESCE(sc.streams, 0) AS streams, |
| | 1082 | COALESCE(alb.title, 'SINGLE') AS album_title, |
| | 1083 | COALESCE(pc.saved_in_playlists, 0) AS saved_in_playlists, |
| 872 | | from songs s |
| 873 | | left join artists a on a.id = s.owner_artist_id |
| 874 | | left join artist_labels al on al.artist_id = a.id |
| 875 | | left join labels l on l.id = al.label_id |
| 876 | | left join album_tracks at on at.song_id = s.id |
| 877 | | left join albums alb on alb.id = at.album_id |
| 878 | | left join song_stream_counts_mv sc on sc.song_id = s.id |
| 879 | | left join song_playlist_counts_mv pc on pc.song_id = s.id |
| 880 | | left join song_average_grade_mv sag on sag.song_id = s.id; |
| 881 | | }}} |
| 882 | | |
| 883 | | |
| 884 | | ==== Време за извршување на прашалникот по додавање на материјализирани погледи |
| | 1086 | FROM songs s |
| | 1087 | LEFT JOIN artists a ON a.id = s.owner_artist_id |
| | 1088 | LEFT JOIN artist_labels al ON al.artist_id = a.id |
| | 1089 | LEFT JOIN labels l ON l.id = al.label_id |
| | 1090 | LEFT JOIN album_tracks at ON at.song_id = s.id |
| | 1091 | LEFT JOIN albums alb ON alb.id = at.album_id |
| | 1092 | LEFT JOIN song_stream_counts_mv sc ON sc.song_id = s.id |
| | 1093 | LEFT JOIN song_playlist_counts_mv pc ON pc.song_id = s.id |
| | 1094 | LEFT JOIN song_average_grade_mv sag ON sag.song_id = s.id; |
| | 1095 | |
| | 1096 | drop index idx_songs_title; |
| | 1097 | |
| | 1098 | drop index idx_album_tracks_song_id; |
| | 1099 | |
| | 1100 | drop index idx_artist_labels_artist_id; |
| | 1101 | }}} |
| | 1102 | |
| | 1103 | |
| | 1104 | === Време за извршување на прашалникот по додавање на материјализирани погледи |