Hello Horiguchi-san, On 09/17/2015 12:45 PM, Kyotaro HORIGUCHI wrote:
After all, what should be done to properly ignore useless conditions would be, 1. Make create_index_paths() to make the list of restrict clauses which are implied by the index predicate of the index in focus. The list would be stored as a member in IndexOptInfo. Then create index clauses excluding the listed clauses and call get_index_paths using them. Modify check_index_only() to ignore the listed clauses when pulling varattnos. This is similar but different a bit to what I said in the previous mail. 2. Pass the listed clauses to generated IndexPath. 3. Modify extract_nonindex_conditions to be called with the exclusion list and the cluases are exluded from the result of the function. 4. Make create_indexscan_plan to extract qpqual excluding the exclusion list. The same result could be obtained by more smarter way but the steps above will archive right decision on whether to do index only scan on partial index and correct cost estimate propery ignoring unused restrictions. Does this make sense for you?
Yes, this seems sane. I've been poking at this a bit too, and I came to the same plan in general, except that I think it's better to build list of clauses that are *not* implied by the index, because that's what we need both in cost_index and check_index_only.
It also seems to me that this change (arguably a bug fix) should pretty much make the original patch irrelevant, because check_index_only can simply walk over the new list.
regards -- Tomas Vondra http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services -- Sent via pgsql-hackers mailing list (firstname.lastname@example.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers