Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit33807c7

Browse files
df7cbmsdemlei
authored andcommitted
Speed up subset operations by looking at the smoc header first
1 parentfbe38aa commit33807c7

File tree

3 files changed

+119
-34
lines changed

3 files changed

+119
-34
lines changed

‎expected/moc1.out‎

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,61 @@ EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
5454
Buffers: shared hit=3
5555
(3 rows)
5656

57+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
58+
SELECT coverage FROM moc1 WHERE coverage @> '0/';
59+
QUERY PLAN
60+
-----------------------------------------------------------------------------
61+
Seq Scan on moc1 (cost=0.00..1.01 rows=1 width=18) (actual rows=1 loops=1)
62+
Filter: (coverage @> '0/'::smoc)
63+
Buffers: shared hit=3
64+
(3 rows)
65+
66+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
67+
SELECT coverage FROM moc1 WHERE coverage <@ '0/';
68+
QUERY PLAN
69+
-----------------------------------------------------------------------------
70+
Seq Scan on moc1 (cost=0.00..1.01 rows=1 width=18) (actual rows=0 loops=1)
71+
Filter: (coverage <@ '0/'::smoc)
72+
Rows Removed by Filter: 1
73+
Buffers: shared hit=3
74+
(4 rows)
75+
76+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
77+
SELECT coverage FROM moc1 WHERE coverage @> '0/1';
78+
QUERY PLAN
79+
-----------------------------------------------------------------------------
80+
Seq Scan on moc1 (cost=0.00..1.01 rows=1 width=18) (actual rows=0 loops=1)
81+
Filter: (coverage @> '0/1'::smoc)
82+
Rows Removed by Filter: 1
83+
Buffers: shared hit=25
84+
(4 rows)
85+
86+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
87+
SELECT coverage FROM moc1 WHERE coverage <@ '0/1';
88+
QUERY PLAN
89+
-----------------------------------------------------------------------------
90+
Seq Scan on moc1 (cost=0.00..1.01 rows=1 width=18) (actual rows=0 loops=1)
91+
Filter: (coverage <@ '0/1'::smoc)
92+
Rows Removed by Filter: 1
93+
Buffers: shared hit=3
94+
(4 rows)
95+
96+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
97+
SELECT coverage FROM moc1 WHERE coverage @> '0/0-11';
98+
QUERY PLAN
99+
-----------------------------------------------------------------------------
100+
Seq Scan on moc1 (cost=0.00..1.01 rows=1 width=18) (actual rows=0 loops=1)
101+
Filter: (coverage @> '0/0-11'::smoc)
102+
Rows Removed by Filter: 1
103+
Buffers: shared hit=3
104+
(4 rows)
105+
106+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
107+
SELECT coverage FROM moc1 WHERE coverage <@ '0/0-11';
108+
QUERY PLAN
109+
-----------------------------------------------------------------------------
110+
Seq Scan on moc1 (cost=0.00..1.01 rows=1 width=18) (actual rows=1 loops=1)
111+
Filter: (coverage <@ '0/0-11'::smoc)
112+
Buffers: shared hit=3
113+
(3 rows)
114+

‎moc.c‎

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -576,51 +576,65 @@ smoc_overlap_neg(PG_FUNCTION_ARGS)
576576

577577
/* check if moc_a is a subset of moc_b */
578578
staticbool
579-
smoc_subset_impl(Smoc*moc_a,Smoc*moc_b)
579+
smoc_subset_impl(Datuma,Datumb)
580580
{
581-
int32a=moc_a->data_begin;
582-
int32b=moc_b->data_begin;
583-
int32moc_a_end=VARSIZE(moc_a)-VARHDRSZ;
584-
int32moc_b_end=VARSIZE(moc_b)-VARHDRSZ;
585-
char*moc_a_base=MOC_BASE(moc_a);
586-
char*moc_b_base=MOC_BASE(moc_b);
581+
Smoc*moc_a= (Smoc*)PG_DETOAST_DATUM_SLICE(a,0,MOC_HEADER_PAGE);
582+
Smoc*moc_b= (Smoc*)PG_DETOAST_DATUM_SLICE(b,0,MOC_HEADER_PAGE);
583+
int32i=moc_a->data_begin;
584+
int32j=moc_b->data_begin;
585+
int32moc_a_end;
586+
int32moc_b_end;
587+
char*moc_a_base;
588+
char*moc_b_base;
587589

588590
// an empty moc is subset of all mocs
589591
if (moc_a->area==0)
590592
return true;
591-
// and empty moc cannot have any other subsets than the empty one
592-
if (moc_b->area==0)
593+
// b is the whole sky
594+
if (moc_b->area==MOC_AREA_ALL_SKY)
595+
return true;
596+
// a cannot be larger than b
597+
if (moc_a->area>moc_b->area)
593598
return false;
594599

595600
// quick exit if the mocs do not overlap at all
596601
if (moc_a->first >=moc_b->last||moc_a->last <=moc_b->first)
597602
return false;
598603

599-
while (a<moc_a_end)// iterate over a
604+
// get full moc
605+
moc_a= (Smoc*)PG_DETOAST_DATUM(a);
606+
moc_b= (Smoc*)PG_DETOAST_DATUM(b);
607+
608+
moc_a_end=VARSIZE(moc_a)-VARHDRSZ;
609+
moc_b_end=VARSIZE(moc_b)-VARHDRSZ;
610+
moc_a_base=MOC_BASE(moc_a);
611+
moc_b_base=MOC_BASE(moc_b);
612+
613+
while (i<moc_a_end)// iterate over a
600614
{
601615
int32mod;
602616
moc_interval*x;
603617
moc_interval*y;
604618

605619
// end of b reached while there's still 'a' intervals
606-
if (b >=moc_b_end)
620+
if (j >=moc_b_end)
607621
return false;
608622

609623
// page bumps
610-
mod= (a+MOC_INTERVAL_SIZE) %PG_TOAST_PAGE_FRAGMENT;
624+
mod= (i+MOC_INTERVAL_SIZE) %PG_TOAST_PAGE_FRAGMENT;
611625
if (mod>0&&mod<MOC_INTERVAL_SIZE)
612-
a+=MOC_INTERVAL_SIZE-mod;
613-
x=MOC_INTERVAL(moc_a_base,a);
626+
i+=MOC_INTERVAL_SIZE-mod;
627+
x=MOC_INTERVAL(moc_a_base,i);
614628

615-
mod= (b+MOC_INTERVAL_SIZE) %PG_TOAST_PAGE_FRAGMENT;
629+
mod= (j+MOC_INTERVAL_SIZE) %PG_TOAST_PAGE_FRAGMENT;
616630
if (mod>0&&mod<MOC_INTERVAL_SIZE)
617-
b+=MOC_INTERVAL_SIZE-mod;
618-
y=MOC_INTERVAL(moc_b_base,b);
631+
j+=MOC_INTERVAL_SIZE-mod;
632+
y=MOC_INTERVAL(moc_b_base,j);
619633

620634
// advance b until as long as we are before the 'a' interval
621635
if (y->second <=x->first)
622636
{
623-
b+=MOC_INTERVAL_SIZE;
637+
j+=MOC_INTERVAL_SIZE;
624638
continue;
625639
}
626640

@@ -633,13 +647,13 @@ smoc_subset_impl(Smoc* moc_a, Smoc* moc_b)
633647
// advance interval that has the lowest end
634648
if (x->second==y->second)
635649
{
636-
a+=MOC_INTERVAL_SIZE;
637-
b+=MOC_INTERVAL_SIZE;
650+
i+=MOC_INTERVAL_SIZE;
651+
j+=MOC_INTERVAL_SIZE;
638652
}
639653
elseif (x->second <=y->second)
640-
a+=MOC_INTERVAL_SIZE;
654+
i+=MOC_INTERVAL_SIZE;
641655
else
642-
b+=MOC_INTERVAL_SIZE;
656+
j+=MOC_INTERVAL_SIZE;
643657
// TODO: we could walk the tree structure to find the next interesting interval
644658
}
645659

@@ -649,33 +663,33 @@ smoc_subset_impl(Smoc* moc_a, Smoc* moc_b)
649663
Datum
650664
smoc_subset_smoc(PG_FUNCTION_ARGS)
651665
{
652-
Smoc*moc_a=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
653-
Smoc*moc_b=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
654-
PG_RETURN_BOOL(smoc_subset_impl(moc_a,moc_b));
666+
Datuma=PG_GETARG_DATUM(0);
667+
Datumb=PG_GETARG_DATUM(1);
668+
PG_RETURN_BOOL(smoc_subset_impl(a,b));
655669
}
656670

657671
Datum
658672
smoc_subset_smoc_neg(PG_FUNCTION_ARGS)
659673
{
660-
Smoc*moc_a=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
661-
Smoc*moc_b=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
662-
PG_RETURN_BOOL(!smoc_subset_impl(moc_a,moc_b));
674+
Datuma=PG_GETARG_DATUM(0);
675+
Datumb=PG_GETARG_DATUM(1);
676+
PG_RETURN_BOOL(!smoc_subset_impl(a,b));
663677
}
664678

665679
Datum
666680
smoc_superset_smoc(PG_FUNCTION_ARGS)
667681
{
668-
Smoc*moc_a=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
669-
Smoc*moc_b=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
670-
PG_RETURN_BOOL(smoc_subset_impl(moc_b,moc_a));
682+
Datuma=PG_GETARG_DATUM(0);
683+
Datumb=PG_GETARG_DATUM(1);
684+
PG_RETURN_BOOL(smoc_subset_impl(b,a));
671685
}
672686

673687
Datum
674688
smoc_superset_smoc_neg(PG_FUNCTION_ARGS)
675689
{
676-
Smoc*moc_a=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
677-
Smoc*moc_b=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
678-
PG_RETURN_BOOL(!smoc_subset_impl(moc_b,moc_a));
690+
Datuma=PG_GETARG_DATUM(0);
691+
Datumb=PG_GETARG_DATUM(1);
692+
PG_RETURN_BOOL(!smoc_subset_impl(b,a));
679693
}
680694

681695
staticbool

‎sql/moc1.sql‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,16 @@ EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
2323
SELECT coverageFROM moc1WHERE coverage &&'0/1';
2424
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
2525
SELECT coverageFROM moc1WHERE coverage &&'0/0-11';
26+
27+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
28+
SELECT coverageFROM moc1WHERE coverage @>'0/';
29+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
30+
SELECT coverageFROM moc1WHERE coverage<@'0/';
31+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
32+
SELECT coverageFROM moc1WHERE coverage @>'0/1';
33+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
34+
SELECT coverageFROM moc1WHERE coverage<@'0/1';
35+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
36+
SELECT coverageFROM moc1WHERE coverage @>'0/0-11';
37+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
38+
SELECT coverageFROM moc1WHERE coverage<@'0/0-11';

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp