![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
#2
| |||
| |||
|
|
It doesn't appear that ANALYZE uses the specified operator class for producing statistics on an index when that operator class is not the default for the data type. This appears to be leading to poor query planning. For speed of indexing a few million urls I'm indexing them with a custom data type. The data type aptly named "urlhash" has: |
#3
| |||
| |||
|
|
On Fri, 2006-11-03 at 15:16 -0700, Rusty Conover wrote: It doesn't appear that ANALYZE uses the specified operator class for producing statistics on an index when that operator class is not the default for the data type. This appears to be leading to poor query planning. For speed of indexing a few million urls I'm indexing them with a custom data type. The data type aptly named "urlhash" has: Have you read the CREATE TYPE man page, specifically with regard to the analyze_function clause? Basically, if you want anything different, you have to write an analysis function yourself. This is what PostGIS (www.postgis.org) does, if you want to look for specific code examples. |
|
ANALYZE collects stats for tables, not indexes, using the default operator class for the datatype. So even though you've clearly specified an opclass for the index, no stats will be collected using it. |
|
Alternatively, perhaps you have fallen foul of this situation? /* * Can't analyze if the opclass uses a storage type * different from the expression result type. We'd get * confused because the type shown in pg_attribute for * the index column doesn't match what we are getting * from the expression. Perhaps this can be fixed * someday, but for now, punt. */ It's in the analyze.c code, but not in the docs. Be interested in a full report of your research, once you're done. |
#4
| |||
| |||
|
|
I just want the ANALYZE call to use the index's opclass definitions of = and if the index is created with a custom operator class that is not the default for the data type. |
|
I don't think I need to write my own analyze function |
#5
| |||
| |||
|
|
On Mon, 2006-11-06 at 14:47 -0700, Rusty Conover wrote: I just want the ANALYZE call to use the index's opclass definitions of = and if the index is created with a custom operator class that is not the default for the data type. Which is exactly what the manual specifically says it doesn't do, therefore you'll need the analyze_function. That capability was put there deliberately to help you out, in this situation. |
#6
| |||
| |||
|
|
On Fri, 2006-11-03 at 15:16 -0700, Rusty Conover wrote: It doesn't appear that ANALYZE uses the specified operator class for producing statistics on an index when that operator class is not the default for the data type. This appears to be leading to poor query planning. For speed of indexing a few million urls I'm indexing them with a custom data type. The data type aptly named "urlhash" has: Have you read the CREATE TYPE man page, specifically with regard to the analyze_function clause? Basically, if you want anything different, you have to write an analysis function yourself. This is what PostGIS (www.postgis.org) does, if you want to look for specific code examples. ANALYZE collects stats for tables, not indexes, using the default operator class for the datatype. So even though you've clearly specified an opclass for the index, no stats will be collected using it. Alternatively, perhaps you have fallen foul of this situation? /* * Can't analyze if the opclass uses a storage type * different from the expression result type. We'd get * confused because the type shown in pg_attribute for * the index column doesn't match what we are getting * from the expression. Perhaps this can be fixed * someday, but for now, punt. */ It's in the analyze.c code, but not in the docs. |
#7
| |||
| |||
|
|
I still think this is a deficiency in the analyze function to not use the operator_class that the index uses when producing statistics for that index. |
#8
| |||
| |||
|
|
On Mon, 2006-11-06 at 15:54 -0700, Rusty Conover wrote: I still think this is a deficiency in the analyze function to not use the operator_class that the index uses when producing statistics for that index. Agreed, but that isn't the way it works right now, AFAICS. TODO... |
![]() |
| Thread Tools | |
| Display Modes | |
| |