create table t (col jsonb);
create index ix_t_col using gin(to_tsvector('pg_catalog.english', jsonb_path_query_array(col, '$.obj.TEXT')));
insert into t values('{
"obj": [
{
"TEXT": "These functions act like their counterparts described above without the _tz suffix, except that these functions support comparisons of date/time values that require timezone-aware conversions.",
"key1": 77,
"key2": "a"
},
{
"TEXT": "Returns target with new_value inserted. If the item designated by the path is an array element, new_value will be inserted before that item if insert_after is false (which is the default), or after it if insert_after is true. If the item designated by the path is an object field, new_value will be inserted only if the object does not already contain that key",
"key1": 99,
"key2": false
}
]
}');
select ts_headline(col, 'function'::tsquery),
ts_headline(arr, 'function'::tsquery)
from (
select col, jsonb_path_query_array(col, '$.obj.TEXT') arr,
to_tsvector('pg_catalog.english', jsonb_path_query_array(col, '$.obj.TEXT')) tsv
from t
) q
where tsv @@ 'function'::tsquery;
jsonb_path_query_array(col, '$.obj.TEXT')
- выделяет все, что у вас по ключу TEXT в массив. Дальше он индексируется PostgreSQL 9.4.13 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4), 64-bit
Django supports PostgreSQL 10 and higher. psycopg2 2.8.4 or higher is required, though the latest release is recommended.
host all all all md5
.CREATE OR REPLACE FUNCTION public.foo(str character varying)
RETURNS SETOF record
LANGUAGE plpgsql
AS $$
BEGIN
IF str = 'i' THEN
RETURN QUERY SELECT i, i*i FROM generate_series(1, 10) i;
ELSE
RETURN QUERY SELECT i, SQRT(i::float) FROM generate_series(1, 10) i;
END IF;
END;
$$
# select * from foo('i') as (key int, value int);
key | value
-----+-------
1 | 1
2 | 4
3 | 9
4 | 16
5 | 25
6 | 36
7 | 49
8 | 64
9 | 81
10 | 100
(10 rows)
# select * from foo('x') as (key int, value float);
key | value
-----+--------------------
1 | 1
2 | 1.4142135623730951
3 | 1.7320508075688772
4 | 2
5 | 2.23606797749979
6 | 2.449489742783178
7 | 2.6457513110645907
8 | 2.8284271247461903
9 | 3
10 | 3.1622776601683795
(10 rows)
Задача - узнать кол-во потенциально полученных строк до их фактической выборки.
SELECT count(*) ...
Ну и - если допустимо - организовать pagination.
SELECT * FROM table
) выборка первых страниц происходит очень быстро (особенно через LIMIT). Но это легко сломать, например, сортировкой create table p (id serial primary key, val text);
create table c (id serial primary key, p_id int not null references p(id) on delete no action deferrable, val text);
insert into p (val) values ('a'), ('b');
insert into c (p_id, val) values (1, 'a1'), (1, 'a2'), (1, 'a3'), (2, 'b1');
begin;
set constraints all deferred;
delete from p where id = 2;
delete from c where p_id = 2;
commit;
CREATE OR REPLACE FUNCTION Foo(st TIMESTAMP, fin TIMESTAMP)
RETURNS TABLE (tstamp timestamptz, val float) AS $$
...
RETURN QUERY SELECT tstamp, val FROM hyptab WHERE tstamp >= st AND tstamp < fin;
END;
$$ LANGUAGE plpgsql;
postgres=# select 123456789::real;
float4
---------------
1.2345679e+08
можно хранить строки произвольной длины, разве что в character varying можно ограничить эту произвольност
no password supplied
То есть, закрытие соединения на уровне кода..
Connections can be used as context managers. Note that a context wraps a transaction: if the context exits with success the transaction is committed, if it exits with an exception the transaction is rolled back. Note that the connection is not closed by the context and it can be used for several contexts
SET SESSION idle_in_transaction_session_timeout = '2min';
1. Есть ли разница разбит ли UPDATE запрос на части? Типа вместо одного большого 10 более мелких. К примеру с разграничением по датам. Если есть, то какая причина?
2. Если запросы разбиты через точку с запятой выполняются ли они в рамках одной транзакции или точка с запятой ограничивает транзакцию? Речь про SQL менеджер.
select generate_series(start_time, end_time, interval '1 second'), t.*
from t
insert into table_Number (key, tstamp)
select * from (
select row_number() over () n, t
from generate_series(NOW() - INTERVAL '90 days', NOW(),'1 min') t
) sq
where n <= 300