vzla_seg
は道路のネットワークセグメントです。各セグメントには一般的な方位角があります。私のパラメータcarAzimuth
と同じ一般的な方向(+/- 30度)上のセグメントを見つけようとしてCOUNT(*) = 3.849.834
このフィルタをsargeableまたはインデックスを改善する方法
CREATE TABLE vzla_seg (`azimuth` int);
INSERT INTO vzla_seg (`azimuth`)
VALUES
(330), (335),
(340), (345),
(350), (355),
(359), (3),
(5), (15),
(20), (25),
(30), (35)
;
イム。
Azimuth
範囲は、コンパス度の場合、[0 ..359]
です。だから、carAzimuth = 345
は方位[315, 325, 359, 0, 5, 15]
carAzimuth = 355
segmentAzimuth = 340 --> (355 - 340) --> 15 < 30
segmentAzimuth = 359 --> (355 - 359) --> abs(- 4) < 30
segmentAzimuth = 20 --> (355 - 20) --> 25 < 30
carAzimuth = 5
segmentAzimuth = 340 --> (5 - 340) --> abs(- 335) > 330
segmentAzimuth = 359 --> (5 - 359) --> abs(- 354) > 330
segmentAzimuth = 20 --> (5 - 20) --> abs( -15) < 30
explain analyze
SELECT *
FROM map.vzla_seg S
WHERE
abs(carAzimuth - S.azimuth) < 30
OR abs(carAzimuth - S.azimuth) > 330
インデックス付きの道路セグメントと同じ方向にある場合:
CREATE INDEX vzla_seg_azimuth_idx
ON map.vzla_seg
USING btree
(azimuth);
説明プラン:
"Seq Scan on vzla_seg s (cost=0.00..151243.55 rows=2138790 width=84)
(actual time=0.061..14086.038 rows=690334 loops=1)"
" Filter: ((abs((345 - azimuth)) < 30) OR (abs((345 - azimuth)) > 330))"
" Rows Removed by Filter: 3159500"
"Total runtime: 14283.524 ms"
ボーナス質問:
- コストが
rows=2.138.790
言うなぜ総COUNT(*) = 3.849.834
- と一致
Rows Removed by Filter: 3.159.500
とrows=690.334
を言って説明した場合は?
- と一致
あなたの質問に 'CREATE TABLE'ステートメントといくつかの' INSERT'ステートメントを貼り付けてください。 –
@ MikeSherrill'CatRecall 'あなたはそこからどのような付加情報が必要なのか、 'テーブル作成'が本当に必要ですか?1つのフィールドだけが'方位角整数 'です。たぶん「方位角」は一般的な用語ではないでしょうか? –
postgresql-performanceタグのinfoリンクに従ってください。 –