updateStats.tcl
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:2k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. #
  2. # updateStats 
  3. #   updates the statistic of number of distinct attribute values
  4. #  (this should really be done by the vacuum command)
  5. #   this is kind of brute force and slow, but it works
  6. #  since we use SELECT DISTINCT to calculate the number of distinct values
  7. # and that does a sort, you need to have plenty of disk space for the 
  8. # intermediate sort files.
  9. # - jolly 6/8/95
  10. #
  11. # update_attnvals
  12. #   takes in a table and updates the attnvals columns for the attributes
  13. # of that table
  14. #
  15. #  conn is the database connection
  16. #  rel is the table name 
  17. proc update_attnvals {conn rel} {
  18.     
  19.    # first, get the oid of the rel
  20.     set res [pg_exec $conn "SELECT oid FROM pg_class where relname = '$rel'"]
  21.     if { [pg_result $res -numTuples] == "0"} {
  22. puts stderr "update_attnvals: Relation named $rel was not found"
  23. return
  24.     }
  25.     set oid [pg_result $res -getTuple 0]
  26.     pg_result $res -clear
  27.     # use this query to find the names of the attributes
  28.     set res [pg_exec $conn "SELECT * FROM $rel WHERE 'f'::bool"]
  29.     set attrNames [pg_result $res -attributes]
  30.     puts "attrNames = $attrNames"
  31.     foreach att $attrNames {
  32. # find how many distinct values there are for this attribute
  33. # this may fail if the user-defined type doesn't have 
  34. # comparison operators defined
  35. set res2 [pg_exec $conn "SELECT DISTINCT $att FROM $rel"]
  36. set NVALS($att) [pg_result $res2 -numTuples]
  37. puts "NVALS($att) is $NVALS($att)"
  38. pg_result $res2 -clear
  39.     }
  40.     pg_result $res -clear
  41.     # now, update the pg_attribute table
  42.     foreach att $attrNames {
  43. # first find the oid of the row to change
  44. set res [pg_exec $conn "SELECT oid FROM pg_attribute a WHERE a.attname = '$att' and a.attrelid = '$oid'"]
  45. set attoid [pg_result $res -getTuple 0]
  46. set res2 [pg_exec $conn "UPDATE pg_attribute SET attnvals = $NVALS($att) where pg_attribute.oid = '$attoid'::oid"]
  47.     }
  48. }
  49. # updateStats
  50. #    takes in a database name
  51. # and updates the attnval stat for all the user-defined tables
  52. # in the database
  53. proc updateStats { dbName } {
  54.     # datnames is the list to be result
  55.     set conn [pg_connect $dbName]
  56.     set res [pg_exec $conn "SELECT relname FROM pg_class WHERE relkind = 'r' and relname !~ '^pg_' and relname !~ '^xinv'"]
  57.     set ntups [pg_result $res -numTuples]
  58.     for {set i 0} {$i < $ntups} {incr i} {
  59. set rel [pg_result $res -getTuple $i]
  60. puts "updating attnvals stats on table $rel"
  61. update_attnvals $conn $rel
  62.     }
  63.     pg_disconnect $conn
  64. }