Обсуждение: How can I optimize a research on text field?
Hello,
What index method can I use for a text field to have a better
optimisation.
I tried btree and hash method, but when I make a clause like : where nom
like '%PICASSO%'; the request don't use any index!?!
example:
mayer98=> explain select count(*) from artistes, oeuvres where
artistes.ref=oeuvres.refartiste and nom like '%PICASSO%';
NOTICE: QUERY PLAN:
Aggregate (cost=4894.04 size=0 width=0)
-> Nested Loop (cost=4894.04 size=874 width=8)
-> Seq Scan on artistes (cost=4837.37 size=1 width=4)
-> Index Scan on oeuvres (cost=56.67 size=685510 width=4)
EXPLAIN
Jérôme Knöbl
On Fri, 30 Oct 1998, Jerome Knobl wrote:
> I tried btree and hash method, but when I make a clause like : where nom
> like '%PICASSO%'; the request don't use any index!?!
Check the FAQ, question 3.10 (or thereabouts). Text searches only use
the index if they are searching for text at the start of the field.
<mike
Can any one help me to CREATE RULE please give me an example with a simple table(s) definition and to create rule on that table Thanku , looking for ur favourable reply
G.Elangovan wrote:
>
> Can any one help me to CREATE RULE
> please give me an example with
> a simple table(s) definition and to create rule on that table
It's on my personal TODO to create a rule system
documentation for users too. The one in the programmers
manual for v6.4 is a bit technical, but you might want to
read it anyway.
Anything below addresses the v6.4 rule system!
Sample 1 - constraint follow/delete
CREATE TABLE prim (
pkey text,
comment text);
CREATE TABLE ref (
rkey text,
skey integer,
comment text);
--
-- Rule to let ref.rkey follow prim.pkey
--
CREATE RULE prim_follow AS ON UPDATE TO prim
WHERE NEW.pkey != OLD.pkey DO
UPDATE ref SET rkey = NEW.pkey WHERE rkey = OLD.pkey;
--
-- Rule to constraint delete references from ref to pkey
--
CREATE RULE prim_delete AS ON DELETE TO prim DO
DELETE FROM ref WHERE rkey = OLD.pkey;
--
-- Some tests
--
INSERT INTO prim VALUES ('k1', 'to get updated');
INSERT INTO prim VALUES ('k2', 'to get deleted');
INSERT INTO ref VALUES ('k1', 1, 'must follow');
INSERT INTO ref VALUES ('k1', 2, 'must follow');
INSERT INTO ref VALUES ('k2', 1, 'must get deleted');
INSERT INTO ref VALUES ('k2', 2, 'must get deleted');
UPDATE prim SET pkey = 'new1' WHERE pkey = 'k1';
SELECT * FROM ref;
rkey|skey|comment
----+----+----------------
k2 | 1|must get deleted
k2 | 2|must get deleted
new1| 1|must follow
new1| 2|must follow
(4 rows)
DELETE FROM prim WHERE pkey = 'k2';
SELECT * FROM ref;
rkey|skey|comment
----+----+-----------
new1| 1|must follow
new1| 2|must follow
(2 rows)
Sample 2 - logging of table changes
CREATE TABLE emp (
ename text,
dept text,
salary money);
CREATE TABLE emp_log (
ename text,
action text,
newsal money,
uname name,
when datetime);
--
-- Rule to log new created employees
--
CREATE RULE emp_ins AS ON INSERT TO emp DO
INSERT INTO emp_log VALUES (
NEW.ename,
'employed',
NEW.salary,
getpgusername(),
'now'::text);
--
-- Rule to log when salary raises
--
CREATE RULE emp_raise AS ON UPDATE TO emp
WHERE NEW.salary > OLD.salary DO
INSERT INTO emp_log VALUES (
NEW.ename,
'raised',
NEW.salary,
getpgusername(),
'now'::text);
--
-- Rule to log when salary is lowered
--
CREATE RULE emp_lower AS ON UPDATE TO emp
WHERE NEW.salary < OLD.salary DO
INSERT INTO emp_log VALUES (
NEW.ename,
'lowered',
NEW.salary,
getpgusername(),
'now'::text);
--
-- Rule to log when employee is fired
--
CREATE RULE emp_fire AS ON DELETE TO emp DO
INSERT INTO emp_log VALUES (
OLD.ename,
'fired',
'$0',
getpgusername(),
'now'::text);
--
-- Some tests
--
INSERT INTO emp VALUES ('wieck', 'development', '$8000.00');
INSERT INTO emp VALUES ('gates', 'management', '$15000.00');
UPDATE emp SET salary = '$10000.00' WHERE ename = 'wieck';
UPDATE emp SET salary = '$12000.00' WHERE ename = 'gates';
DELETE FROM emp WHERE ename = 'gates';
SELECT * FROM emp_log;
ename|action |newsal |uname|when
-----+--------+----------+-----+----------------------------
wieck|employed|$8,000.00 |pgsql|Wed Nov 04 12:19:24 1998 MET
gates|employed|$15,000.00|pgsql|Wed Nov 04 12:19:26 1998 MET
wieck|raised |$10,000.00|pgsql|Wed Nov 04 12:19:27 1998 MET
gates|lowered |$12,000.00|pgsql|Wed Nov 04 12:19:28 1998 MET
gates|fired |$0.00 |pgsql|Wed Nov 04 12:19:30 1998 MET
(5 rows)
Note: The explicit 'now'::text is required. Otherwise 'now'
is interpreted at CREATE RULE time and all log entries will
contain that date instead of the time it happened.
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#======================================== jwieck@debis.com (Jan Wieck) #
I tried Creating RULE with both the example
In first example both the rule failed with error "old table not found"
In case of second example
i managed to create
but other three rule failed
CREATE RULE emp_lower AS ON UPDATE TO emp
WHERE NEW.salary < OLD.salary DO
INSERT INTO emp_log VALUES (
NEW.ename,
'lowered',
NEW.salary,
getpgusername(),
'now'::text);
ERROR: old: Table does not exist.
CREATE RULE emp_fire AS ON DELETE TO emp DO
INSERT INTO emp_log VALUES (
OLD.ename,
'fired',
'$0',
getpgusername(),
'now'::text);
ERROR: old: Table does not exist.
Please giveme some more info on the KEY word (NEW and OLD).attribute
Note : iam using postgresql 6.3.2
Thanku , for ur kind help
On Wed, 4 Nov 1998, Jan Wieck wrote:
> G.Elangovan wrote:
>
> >
> > Can any one help me to CREATE RULE
> > please give me an example with
> > a simple table(s) definition and to create rule on that table
>
> It's on my personal TODO to create a rule system
> documentation for users too. The one in the programmers
> manual for v6.4 is a bit technical, but you might want to
> read it anyway.
>
> Anything below addresses the v6.4 rule system!
>
> Sample 1 - constraint follow/delete
>
> CREATE TABLE prim (
> pkey text,
> comment text);
>
> CREATE TABLE ref (
> rkey text,
> skey integer,
> comment text);
>
> --
> -- Rule to let ref.rkey follow prim.pkey
> --
> CREATE RULE prim_follow AS ON UPDATE TO prim
> WHERE NEW.pkey != OLD.pkey DO
> UPDATE ref SET rkey = NEW.pkey WHERE rkey = OLD.pkey;
>
> --
> -- Rule to constraint delete references from ref to pkey
> --
> CREATE RULE prim_delete AS ON DELETE TO prim DO
> DELETE FROM ref WHERE rkey = OLD.pkey;
>
> --
> -- Some tests
> --
> INSERT INTO prim VALUES ('k1', 'to get updated');
> INSERT INTO prim VALUES ('k2', 'to get deleted');
> INSERT INTO ref VALUES ('k1', 1, 'must follow');
> INSERT INTO ref VALUES ('k1', 2, 'must follow');
> INSERT INTO ref VALUES ('k2', 1, 'must get deleted');
> INSERT INTO ref VALUES ('k2', 2, 'must get deleted');
>
> UPDATE prim SET pkey = 'new1' WHERE pkey = 'k1';
> SELECT * FROM ref;
> rkey|skey|comment
> ----+----+----------------
> k2 | 1|must get deleted
> k2 | 2|must get deleted
> new1| 1|must follow
> new1| 2|must follow
> (4 rows)
>
> DELETE FROM prim WHERE pkey = 'k2';
> SELECT * FROM ref;
> rkey|skey|comment
> ----+----+-----------
> new1| 1|must follow
> new1| 2|must follow
> (2 rows)
>
> Sample 2 - logging of table changes
>
> CREATE TABLE emp (
> ename text,
> dept text,
> salary money);
>
> CREATE TABLE emp_log (
> ename text,
> action text,
> newsal money,
> uname name,
> when datetime);
>
> --
> -- Rule to log new created employees
> --
> CREATE RULE emp_ins AS ON INSERT TO emp DO
> INSERT INTO emp_log VALUES (
> NEW.ename,
> 'employed',
> NEW.salary,
> getpgusername(),
> 'now'::text);
>
> --
> -- Rule to log when salary raises
> --
> CREATE RULE emp_raise AS ON UPDATE TO emp
> WHERE NEW.salary > OLD.salary DO
> INSERT INTO emp_log VALUES (
> NEW.ename,
> 'raised',
> NEW.salary,
> getpgusername(),
> 'now'::text);
>
> --
> -- Rule to log when salary is lowered
> --
> CREATE RULE emp_lower AS ON UPDATE TO emp
> WHERE NEW.salary < OLD.salary DO
> INSERT INTO emp_log VALUES (
> NEW.ename,
> 'lowered',
> NEW.salary,
> getpgusername(),
> 'now'::text);
>
> --
> -- Rule to log when employee is fired
> --
> CREATE RULE emp_fire AS ON DELETE TO emp DO
> INSERT INTO emp_log VALUES (
> OLD.ename,
> 'fired',
> '$0',
> getpgusername(),
> 'now'::text);
>
>
> --
> -- Some tests
> --
> INSERT INTO emp VALUES ('wieck', 'development', '$8000.00');
> INSERT INTO emp VALUES ('gates', 'management', '$15000.00');
>
> UPDATE emp SET salary = '$10000.00' WHERE ename = 'wieck';
> UPDATE emp SET salary = '$12000.00' WHERE ename = 'gates';
>
> DELETE FROM emp WHERE ename = 'gates';
>
> SELECT * FROM emp_log;
> ename|action |newsal |uname|when
> -----+--------+----------+-----+----------------------------
> wieck|employed|$8,000.00 |pgsql|Wed Nov 04 12:19:24 1998 MET
> gates|employed|$15,000.00|pgsql|Wed Nov 04 12:19:26 1998 MET
> wieck|raised |$10,000.00|pgsql|Wed Nov 04 12:19:27 1998 MET
> gates|lowered |$12,000.00|pgsql|Wed Nov 04 12:19:28 1998 MET
> gates|fired |$0.00 |pgsql|Wed Nov 04 12:19:30 1998 MET
> (5 rows)
>
> Note: The explicit 'now'::text is required. Otherwise 'now'
> is interpreted at CREATE RULE time and all log entries will
> contain that date instead of the time it happened.
>
> Jan
>
> --
>
> #======================================================================#
> # It's easier to get forgiveness for being wrong than for being right. #
> # Let's break this rule - forgive me. #
> #======================================== jwieck@debis.com (Jan Wieck) #
>
>
>
My first mail was bit incomplete
Note : OLD is not recognized when i used to create rule on example given
below,i tried with CURRENT instead of OLD , rule was created
but when i execute some operation on it backend connection get closed
my practical result is
CREATE TABLE prim (
> pkey text,
> comment text);
>
> CREATE TABLE ref (
> rkey text,
> skey integer,
> comment text);
>
is Ok
CREATE RULE emp_ins AS ON INSERT TO emp DO
> INSERT INTO emp_log VALUES (
> NEW.ename,
> 'employed',
> NEW.salary,
> getpgusername(),
> 'now'::text);
is also OK Created
CREATE RULE emp_del as on DELETE to emp
do DELETE from emp_log where ename=OLD.ename
old table not found
but
systemdb=> CREATE RULE emp_del as on DELETE to emp
systemdb-> do DELETE from emp_log where ename=current.ename
systemdb-> ;
CREATE
systemdb=>
systemdb=> select * from emp;
ename |dept |salary
-------+-----------+----------
wieck |development|$8,000.00
gates |management |$15,000.00
elangog|lucent |$1,000.00
(3 rows)
systemdb=> delete from emp where ename='gates';
PQexec() -- Request was sent to backend, but backend closed the channel
before responding.
This probably means the backend terminated abnormally before or
while processing the request.
systemdb=>
please help me
to create a rule on DELETE
Thanku ,expecting helpful reply
On Wed, 4 Nov 1998, Jan Wieck wrote:
> G.Elangovan wrote:
>
> >
> > Can any one help me to CREATE RULE
> > please give me an example with
> > a simple table(s) definition and to create rule on that table
>
> It's on my personal TODO to create a rule system
> documentation for users too. The one in the programmers
> manual for v6.4 is a bit technical, but you might want to
> read it anyway.
>
> Anything below addresses the v6.4 rule system!
>
> Sample 1 - constraint follow/delete
>
> CREATE TABLE prim (
> pkey text,
> comment text);
>
> CREATE TABLE ref (
> rkey text,
> skey integer,
> comment text);
>
> --
> -- Rule to let ref.rkey follow prim.pkey
> --
> CREATE RULE prim_follow AS ON UPDATE TO prim
> WHERE NEW.pkey != OLD.pkey DO
> UPDATE ref SET rkey = NEW.pkey WHERE rkey = OLD.pkey;
>
> --
> -- Rule to constraint delete references from ref to pkey
> --
> CREATE RULE prim_delete AS ON DELETE TO prim DO
> DELETE FROM ref WHERE rkey = OLD.pkey;
>
> --
> -- Some tests
> --
> INSERT INTO prim VALUES ('k1', 'to get updated');
> INSERT INTO prim VALUES ('k2', 'to get deleted');
> INSERT INTO ref VALUES ('k1', 1, 'must follow');
> INSERT INTO ref VALUES ('k1', 2, 'must follow');
> INSERT INTO ref VALUES ('k2', 1, 'must get deleted');
> INSERT INTO ref VALUES ('k2', 2, 'must get deleted');
>
> UPDATE prim SET pkey = 'new1' WHERE pkey = 'k1';
> SELECT * FROM ref;
> rkey|skey|comment
> ----+----+----------------
> k2 | 1|must get deleted
> k2 | 2|must get deleted
> new1| 1|must follow
> new1| 2|must follow
> (4 rows)
>
> DELETE FROM prim WHERE pkey = 'k2';
> SELECT * FROM ref;
> rkey|skey|comment
> ----+----+-----------
> new1| 1|must follow
> new1| 2|must follow
> (2 rows)
>
> Sample 2 - logging of table changes
>
> CREATE TABLE emp (
> ename text,
> dept text,
> salary money);
>
> CREATE TABLE emp_log (
> ename text,
> action text,
> newsal money,
> uname name,
> when datetime);
>
> --
> -- Rule to log new created employees
> --
> CREATE RULE emp_ins AS ON INSERT TO emp DO
> INSERT INTO emp_log VALUES (
> NEW.ename,
> 'employed',
> NEW.salary,
> getpgusername(),
> 'now'::text);
>
> --
> -- Rule to log when salary raises
> --
> CREATE RULE emp_raise AS ON UPDATE TO emp
> WHERE NEW.salary > OLD.salary DO
> INSERT INTO emp_log VALUES (
> NEW.ename,
> 'raised',
> NEW.salary,
> getpgusername(),
> 'now'::text);
>
> --
> -- Rule to log when salary is lowered
> --
> CREATE RULE emp_lower AS ON UPDATE TO emp
> WHERE NEW.salary < OLD.salary DO
> INSERT INTO emp_log VALUES (
> NEW.ename,
> 'lowered',
> NEW.salary,
> getpgusername(),
> 'now'::text);
>
> --
> -- Rule to log when employee is fired
> --
> CREATE RULE emp_fire AS ON DELETE TO emp DO
> INSERT INTO emp_log VALUES (
> OLD.ename,
> 'fired',
> '$0',
> getpgusername(),
> 'now'::text);
>
>
> --
> -- Some tests
> --
> INSERT INTO emp VALUES ('wieck', 'development', '$8000.00');
> INSERT INTO emp VALUES ('gates', 'management', '$15000.00');
>
> UPDATE emp SET salary = '$10000.00' WHERE ename = 'wieck';
> UPDATE emp SET salary = '$12000.00' WHERE ename = 'gates';
>
> DELETE FROM emp WHERE ename = 'gates';
>
> SELECT * FROM emp_log;
> ename|action |newsal |uname|when
> -----+--------+----------+-----+----------------------------
> wieck|employed|$8,000.00 |pgsql|Wed Nov 04 12:19:24 1998 MET
> gates|employed|$15,000.00|pgsql|Wed Nov 04 12:19:26 1998 MET
> wieck|raised |$10,000.00|pgsql|Wed Nov 04 12:19:27 1998 MET
> gates|lowered |$12,000.00|pgsql|Wed Nov 04 12:19:28 1998 MET
> gates|fired |$0.00 |pgsql|Wed Nov 04 12:19:30 1998 MET
> (5 rows)
>
> Note: The explicit 'now'::text is required. Otherwise 'now'
> is interpreted at CREATE RULE time and all log entries will
> contain that date instead of the time it happened.
>
> Jan
>
> --
>
> #======================================================================#
> # It's easier to get forgiveness for being wrong than for being right. #
> # Let's break this rule - forgive me. #
> #======================================== jwieck@debis.com (Jan Wieck) #
>
>
>
>
>
> I tried Creating RULE with both the example
> In first example both the rule failed with error "old table not found"
> In case of second example
> i managed to create
>
> [...]
>
> ERROR: old: Table does not exist.
> Please giveme some more info on the KEY word (NEW and OLD).attribute
> Note : iam using postgresql 6.3.2
>
> Thanku , for ur kind help
DON'T TRY TO USE THE RULE SYSTEM IN A v6.3.2 DATABASE. IT'S
BUGGY AND DOES NOT WORK AT ALL.
All I wrote depends on the major changes I've done in the
rule system for v6.4.
In v6.4 CURRENT is aliased with OLD and in v6.5 CURRENT will
disappear completely.
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#======================================== jwieck@debis.com (Jan Wieck) #