سؤال

لقد حصلت على التعبيرات العادية المخزنة كما varcharالصورة في عمود ، والتي أحتاج لمطابقة ضد المدخلات الواردة.على سبيل المثال ، قد يحتوي الجدول على:

| field |     value     |
|-------|---------------|
| email | .*@domain.com |

وسيكون الاستعلام:

SELECT *
FROM table
WHERE field = 'email'
  AND 'someone@domain.com' ~* value

سأكون أول من يعترف هذا هو سخيف جدا ، على الرغم من أنه فعل جيدا بما فيه الكفاية لمدة 2 سنوات.يصل الجدول الآن إلى 10 آلاف صف من الصفوف ، وتباطأت الاستعلامات إلى 3 ثوان.لقد نقلتنا بالفعل إلى استراتيجية أكثر منطقية ، لذا فإن هذا السؤال أكاديمي بحت.

إذا كنت قد حافظت على هذا الإعداد, هل هناك أي طريقة لجعل البحث فعالا?كنت آمل لبعض الأخوة من varchar_pattern_ops, ، ولكن هذا الاستعلام هو عكس ما يحل.


مع فكرة أسفل ، وهنا الجدول الكامل ، الاستعلام ، وشرح.

+------------+-----------------------------+------------------------------------------------------------+
| Column     | Type                        | Modifiers                                                  |
|------------+-----------------------------+------------------------------------------------------------|
| id         | integer                     | not null default nextval('table_id_seq'::regclass)         |
| field      | character varying(255)      | not null                                                   |
| value      | character varying(1000)     | not null                                                   |
| comment    | text                        |                                                            |
+------------+-----------------------------+------------------------------------------------------------+
Indexes:
    "table_pkey" PRIMARY KEY, btree (id)
    "index_table_on_field_and_value" UNIQUE, btree (field, value)


EXPLAIN ANALYZE
SELECT *
FROM table
WHERE (
    (field = 'contact_email' AND 'person@place.com' ~* value)
 OR (field = 'phone'         AND value = '1234567890')
 OR (field = 'unique_id'     AND value = 'abcdef')
);

Seq Scan on table (cost=0.00..613.08 rows=58 width=1) (actual time=744.371..744.371 rows=0 loops=1)
Filter: ((((field)::text = 'contact_email'::text) AND ('person@place.com'::text ~* (value)::text))
      OR (((field)::text = 'phone'::text) AND ((value)::text = '01234567890'::text))              
      OR (((field)::text = 'unique_id'::text) AND ((value)::text = 'abcdef'::text)))             
Rows Removed by Filter: 11643
Total runtime: 744.395 ms
هل كانت مفيدة؟

المحلول

نسخة قصيرة:لا.ليس هناك طريقة عملية (في بوستغريزل ، على الأقل) لفهرسة عمود نمط بحيث يمكن أن تكون مطابقة ضد مدخلات نص عادي بطريقة من شأنها تسريع "هل هذا النص العادي تطابق أي من هذه الأنماط" الاستعلامات.

سوف بوستغريزل تحتاج إلى نوع مؤشر مخصص خاص أن" فهم " مباريات نمط.لست متأكدا من مدى عملية تنفيذ واحد ، ولا مقدار ما يمكن اكتسابه من مثل هذا المؤشر.نظرا لعدم وجود واحد ، فإن السؤال أكاديمي إلى حد ما.

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