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

Commitfbe38aa

Browse files
df7cbmsdemlei
authored andcommitted
Speed up overlaps operation by looking at the smoc header first
1 parentc140f67 commitfbe38aa

File tree

4 files changed

+80
-22
lines changed

4 files changed

+80
-22
lines changed

‎expected/moc1.out‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,31 @@ EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
2626
Buffers: shared hit=3
2727
(4 rows)
2828

29+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
30+
SELECT coverage FROM moc1 WHERE coverage && '0/';
31+
QUERY PLAN
32+
-----------------------------------------------------------------------------
33+
Seq Scan on moc1 (cost=0.00..1.01 rows=1 width=18) (actual rows=0 loops=1)
34+
Filter: (coverage && '0/'::smoc)
35+
Rows Removed by Filter: 1
36+
Buffers: shared hit=3
37+
(4 rows)
38+
39+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
40+
SELECT coverage FROM moc1 WHERE coverage && '0/1';
41+
QUERY PLAN
42+
-----------------------------------------------------------------------------
43+
Seq Scan on moc1 (cost=0.00..1.01 rows=1 width=18) (actual rows=1 loops=1)
44+
Filter: (coverage && '0/1'::smoc)
45+
Buffers: shared hit=25
46+
(3 rows)
47+
48+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
49+
SELECT coverage FROM moc1 WHERE coverage && '0/0-11';
50+
QUERY PLAN
51+
-----------------------------------------------------------------------------
52+
Seq Scan on moc1 (cost=0.00..1.01 rows=1 width=18) (actual rows=1 loops=1)
53+
Filter: (coverage && '0/0-11'::smoc)
54+
Buffers: shared hit=3
55+
(3 rows)
56+

‎moc.c‎

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -495,39 +495,60 @@ smoc_neq(PG_FUNCTION_ARGS)
495495
}
496496

497497
staticbool
498-
smoc_overlap_impl(Smoc*moc_a,Smoc*moc_b)
498+
smoc_overlap_impl(Datuma,Datumb)
499499
{
500-
int32a=moc_a->data_begin;
501-
int32b=moc_b->data_begin;
502-
int32moc_a_end=VARSIZE(moc_a)-VARHDRSZ;
503-
int32moc_b_end=VARSIZE(moc_b)-VARHDRSZ;
504-
char*moc_a_base=MOC_BASE(moc_a);
505-
char*moc_b_base=MOC_BASE(moc_b);
500+
Smoc*moc_a= (Smoc*)PG_DETOAST_DATUM_SLICE(a,0,MOC_HEADER_PAGE);
501+
Smoc*moc_b= (Smoc*)PG_DETOAST_DATUM_SLICE(b,0,MOC_HEADER_PAGE);
502+
int32i=moc_a->data_begin;
503+
int32j=moc_b->data_begin;
504+
int32moc_a_end;
505+
int32moc_b_end;
506+
char*moc_a_base;
507+
char*moc_b_base;
506508

507-
while (a<moc_a_end&&b<moc_b_end)// iterate over both in parallel
509+
// empty mocs do not overlap
510+
if (moc_a->area==0||moc_b->area==0)
511+
return false;
512+
// quick exit if the mocs do not overlap at all
513+
if (moc_a->first >=moc_b->last||moc_a->last <=moc_b->first)
514+
return false;
515+
// all-sky mocs overlap everything
516+
if (moc_a->area==MOC_AREA_ALL_SKY||moc_b->area==MOC_AREA_ALL_SKY)
517+
return true;
518+
519+
// get full moc
520+
moc_a= (Smoc*)PG_DETOAST_DATUM(a);
521+
moc_b= (Smoc*)PG_DETOAST_DATUM(b);
522+
523+
moc_a_end=VARSIZE(moc_a)-VARHDRSZ;
524+
moc_b_end=VARSIZE(moc_b)-VARHDRSZ;
525+
moc_a_base=MOC_BASE(moc_a);
526+
moc_b_base=MOC_BASE(moc_b);
527+
528+
while (i<moc_a_end&&j<moc_b_end)// iterate over both in parallel
508529
{
509530
moc_interval*x;
510531
moc_interval*y;
511532

512533
// page bumps
513-
int32mod= (a+MOC_INTERVAL_SIZE) %PG_TOAST_PAGE_FRAGMENT;
534+
int32mod= (i+MOC_INTERVAL_SIZE) %PG_TOAST_PAGE_FRAGMENT;
514535
if (mod>0&&mod<MOC_INTERVAL_SIZE)
515-
a+=MOC_INTERVAL_SIZE-mod;
516-
x=MOC_INTERVAL(moc_a_base,a);
536+
i+=MOC_INTERVAL_SIZE-mod;
537+
x=MOC_INTERVAL(moc_a_base,i);
517538

518-
mod= (b+MOC_INTERVAL_SIZE) %PG_TOAST_PAGE_FRAGMENT;
539+
mod= (j+MOC_INTERVAL_SIZE) %PG_TOAST_PAGE_FRAGMENT;
519540
if (mod>0&&mod<MOC_INTERVAL_SIZE)
520-
b+=MOC_INTERVAL_SIZE-mod;
521-
y=MOC_INTERVAL(moc_b_base,b);
541+
j+=MOC_INTERVAL_SIZE-mod;
542+
y=MOC_INTERVAL(moc_b_base,j);
522543

523544
if (x->second <=y->first)// a entirely left of b, advance a
524545
{
525-
a+=MOC_INTERVAL_SIZE;
546+
i+=MOC_INTERVAL_SIZE;
526547
continue;
527548
}
528549
if (y->second <=x->first)// b entirely left of a, advance b
529550
{
530-
b+=MOC_INTERVAL_SIZE;
551+
j+=MOC_INTERVAL_SIZE;
531552
continue;
532553
}
533554

@@ -540,17 +561,17 @@ smoc_overlap_impl(Smoc* moc_a, Smoc* moc_b)
540561
Datum
541562
smoc_overlap(PG_FUNCTION_ARGS)
542563
{
543-
Smoc*moc_a=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
544-
Smoc*moc_b=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
545-
PG_RETURN_BOOL(smoc_overlap_impl(moc_a,moc_b));
564+
Datuma=PG_GETARG_DATUM(0);
565+
Datumb=PG_GETARG_DATUM(1);
566+
PG_RETURN_BOOL(smoc_overlap_impl(a,b));
546567
}
547568

548569
Datum
549570
smoc_overlap_neg(PG_FUNCTION_ARGS)
550571
{
551-
Smoc*moc_a=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
552-
Smoc*moc_b=(Smoc*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
553-
PG_RETURN_BOOL(!smoc_overlap_impl(moc_a,moc_b));
572+
Datuma=PG_GETARG_DATUM(0);
573+
Datumb=PG_GETARG_DATUM(1);
574+
PG_RETURN_BOOL(!smoc_overlap_impl(a,b));
554575
}
555576

556577
/* check if moc_a is a subset of moc_b */

‎pgs_moc.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,6 @@ Datum smoc_spoly(PG_FUNCTION_ARGS);
9292
hpint64readNumber(constchar*,int*);
9393
charreadChar(constchar*,int*);
9494

95+
#defineMOC_AREA_ALL_SKY 3458764513820540928
96+
9597
#endif

‎sql/moc1.sql‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,10 @@ SELECT length(coverage::text) FROM moc1;
1616
-- verify that equality doesn't read the whole toasted value
1717
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
1818
SELECT coverageFROM moc1WHERE coverage='0/';
19+
20+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
21+
SELECT coverageFROM moc1WHERE coverage &&'0/';
22+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
23+
SELECT coverageFROM moc1WHERE coverage &&'0/1';
24+
EXPLAIN (ANALYZE, BUFFERS, TIMING OFF, SUMMARY OFF)
25+
SELECT coverageFROM moc1WHERE coverage &&'0/0-11';

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp