Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UPDATE uniusers RETURNING * #612

Open
m1kc opened this issue Feb 27, 2016 · 4 comments
Open

UPDATE uniusers RETURNING * #612

m1kc opened this issue Feb 27, 2016 · 4 comments

Comments

@m1kc
Copy link
Member

m1kc commented Feb 27, 2016

Max Musatov, [27.02.16 18:03]
Слушай. А нельзя случайно сделать что-то типа UPDATE where sessid = '123' RETURNING *?

Max Musatov, [27.02.16 18:04]
Вместо этих двух:
4 ms: SELECT uniusers.* FROM uniusers WHERE sessid = "WoijYCIQX6AcLlQpvs18QShmKPlSJNe4NisZkw8zrZUPzgZ4tb9ab6oabKqn3zHA" AND sess_time > NOW() - "3600" * INTERVAL '1 SECOND'
24 ms: UPDATE uniusers SET sess_time = NOW() WHERE id = "1"

@m1kc
Copy link
Member Author

m1kc commented Feb 27, 2016

Max Musatov, [27.02.16 18:11]
UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ]
...
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

Можно!

@m1kc
Copy link
Member Author

m1kc commented Feb 27, 2016

uonline=# UPDATE uniusers SET sess_time = NOW() WHERE sessid = 'WoijYCIQX6AcLlQpvs18QShmKPlSJNe4NisZkw8zrZUPzgZ4tb9ab6oabKqn3zHA' AND sess_time > NOW() - 3600 * INTERVAL '1 SECOND' RETURNING *;
 id | permissions | username | mail |       salt       |                                                                                             

             hash                                                                                                                                    
                                                                                                                           |                         
     sessid                              |           sess_time           |           reg_time            | character_id 
----+-------------+----------+------+------------------+---------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------+-------------------------
-----------------------------------------+-------------------------------+-------------------------------+--------------
  1 | user        | master   |      | OC2gVRPY87WPA844 | 00df1730bcf3f80b6c6f79ba0c415280b079f3f4c2b988f00e51b772a882464a2b7f18994a28e00ba7f29f0ccd8c
b8ccc3a8fb4e7d73b52e35a59fac401ce977395efefbf03ace9a8de9344984e3480c9c4ea1f205e67b5fb3e97dce03719f401a7459515ff89d2251ec7f0d744d989b0e5f0e781f6f407b1
47ee282b1b8d3aaf8e498fcfa356055ae5bc1fb8ac02a0c0e93265eb74e143c42cad606955727c9ae30f3ab6129b62e15668129e059cfbf2bb742436705a4a7a8945336d1ecf7a850f0b3
3b99d7b82c1cfec20cf73662e66e8077f7eeda521390f90f24b909b0067b3d8622af39a563d80b604f9dfad154ff9b06c3ed6cec824df7bb6fb4a8251d | WoijYCIQX6AcLlQpvs18QShm
KPlSJNe4NisZkw8zrZUPzgZ4tb9ab6oabKqn3zHA | 2016-02-27 18:14:24.438472+03 | 2015-08-29 03:06:48.573311+03 |          648
(1 строка)

UPDATE 1



uonline=# EXPLAIN ANALYZE UPDATE uniusers SET sess_time = NOW() WHERE sessid = 'WoijYCIQX6AcLlQpvs18QShmKPlSJNe4NisZkw8zrZUPzgZ4tb9ab6oabKqn3zHA' AND sess_time > NOW() - 3600 * INTERVAL '1 SECOND' RETURNING *;
                                                                       QUERY PLAN                                                                    

-----------------------------------------------------------------------------------------------------------------------------------------------------
---
 Update on uniusers  (cost=0.00..1.08 rows=1 width=662) (actual time=0.070..0.071 rows=1 loops=1)
   ->  Seq Scan on uniusers  (cost=0.00..1.08 rows=1 width=662) (actual time=0.041..0.042 rows=1 loops=1)
         Filter: ((sessid = 'WoijYCIQX6AcLlQpvs18QShmKPlSJNe4NisZkw8zrZUPzgZ4tb9ab6oabKqn3zHA'::text) AND (sess_time > (now() - '01:00:00'::interval)
))
         Rows Removed by Filter: 3
 Planning time: 0.217 ms
 Execution time: 0.148 ms
(6 строк)

@3bl3gamer
Copy link
Member

Так вроде ж как раз фишка в том, что этот долгий UPDATE отрабатывает независимо от ответа на запрос, а последний благодаря этому ускоряется... аж на целых 20мс (хотя в моём случае почему-то на 200).

@m1kc
Copy link
Member Author

m1kc commented Mar 2, 2016

С одной стороны, так код проще, красивее и надёжнее. С другой - 20 мс на дороге не валяются.

Там ещё надо прочекать, как работают индексы по sessid, есть ли они сейчас вообще, насколько с ними быстрее поиск, скажем, из 10000 сессий, и насколько часто они перестраиваются. Может, и как есть оставим. Подумать надо, в общем.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants