سؤال

في postgis ، ST_GeomFromText اتصل جدا مكلفة ؟ أسأل الغالب لأن لدي كثير من الأحيان يسمى استعلام محاولات للعثور على النقطة التي هي أقرب نقطة أخرى يطابق بعض المعايير ، الذي هو أيضا على مسافة معينة من نقطة أخرى ، والطريقة التي أنا حاليا كتبته يفعل نفس ST_GeomFromText مرتين:

 $findNearIDMatchStmt = $postconn->prepare(
    "SELECT     internalid " .
    "FROM       waypoint " .
    "WHERE      id = ? AND " .
    "           category = ? AND ".
    "           (b.category in (1, 3) OR type like ?) AND ".
    "           ST_DWithin(point, ST_GeomFromText(?," . SRID .
    "           ),".  SMALL_EPSILON . ") " .
    "           ORDER BY ST_Distance(point, ST_GeomFromText(?,", SRID .
    "           )) " .
    "           LIMIT 1");

هل هناك طريقة أفضل لإعادة كتابة هذا ؟

قليلا OT:في شاشة المعاينة ، يؤكد يتم تقديمها كما & # 9 5 ; - آمل أن لن تظهر بهذه الطريقة في ما بعد.

هل كانت مفيدة؟

المحلول

أنا لا أصدق ST_GeomFromText() هي مكلفة بشكل خاص ، على الرغم من أن في الماضي لقد الأمثل PostGIS الاستفسارات عن طريق إنشاء وظيفة ، معلنا متغير ومن ثم تعيين نتيجة ST_GeomFromText إلى متغير.

هل حاولت التحقق من تنفيذ خطة الاستعلام مع مجموعة متنوعة من معلمات مختلفة لأن هذا يجب أن تعطيك فكرة محددة من أي بت من الاستعلام يتم أخذ الوقت ؟

أعتقد أن معظم من وقت التنفيذ سيكون في المكالمات ST_DWithin() و ST_Distance(), ، على الرغم من أن إذا كان معرف الفئة الأعمدة ليست مفهرسة ثم أنه قد يكون به بعض مثيرة للاهتمام الجدول المسح الضوئي.

نصائح أخرى

@Ubiguch يبدو أن ST_DWithin يستخدم فهرس الجغرافية ، بحيث يبدو أن خفض عدد من النقاط إلى أن الاستعلام بسرعة كبيرة.

 navaid=> explain select internalid from waypoint where id != 'KROC' AND ST_DWithin(point,                                                                  ST_GeomFromText('POINT(-77.6723888888889 43.1188611111111)',4326), 0.05) order by st_distance(point, st_geomfromtext('POINT(-77.6723888888889 43.1188611111111)',4326)) limit 1;
                                                                                                                                                                                                                                                      QUERY PLAN                                                                                                                                                                                                                                                       
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=8.37..8.38 rows=1 width=104)
   ->  Sort  (cost=8.37..8.38 rows=1 width=104)
         Sort Key: (st_distance(point, '0101000020E61000002FFE676B086B53C0847E44D7368F4540'::geometry))
         ->  Index Scan using waypoint_point_idx on waypoint  (cost=0.00..8.36 rows=1 width=104)
               Index Cond: (point && '0103000020E61000000100000005000000000000C03B6E53C000000060D0884540000000C03B6E53C0000000409D95454000000020D56753C0000000409D95454000000020D56753C000000060D0884540000000C03B6E53C000000060D0884540'::geometry)
               Filter: (((id)::text <> 'KROC'::text) AND (point && '0103000020E61000000100000005000000000000C03B6E53C000000060D0884540000000C03B6E53C0000000409D95454000000020D56753C0000000409D95454000000020D56753C000000060D0884540000000C03B6E53C000000060D0884540'::geometry) AND ('0101000020E61000002FFE676B086B53C0847E44D7368F4540'::geometry && st_expand(point, 0.05::double precision)) AND (st_distance(point, '0101000020E61000002FFE676B086B53C0847E44D7368F4540'::geometry) < 0.05::double precision))
(6 rows)

دون order by و limit, يبدو نموذجية الاستعلام العودة فقط 5-10 نقاط كحد أقصى.لذلك أنا ربما لا ينبغي أن تقلق بشأن التكلفة الإضافية عامل التصفية الذي يتم تطبيقه على النقاط التي تم إرجاعها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top