Analyze Statistics at the Schema Level (Part 2): Quick Tip
Jim Knicely authored this tip.
The ANALYZE_STATISTICS function only accepts a table/projection/column name as input. In yesterday’s Vertica Quick Tip, you learned how to get Vertica to generate and execute ANALYZE_STATISTICS SQL statements, one for each table in a given schema.
It was an okay solution, but not very convenient. A better option is to create your own function (external procedure) that does all of the work for you.
**Example: **
Here is the code for the procedure (a simple BASH script):
dbadmin=> \! cat /home/dbadmin/sfdc/procedures/analyze_schema_statistics.sh
#!/bin/bash
# Simple external procedure to run analyze_statistics function at the schema level
# This procedure accepts one parameter (a schema name)
source ~/.bashrc
/opt/vertica/bin/vsql -Atc "SELECT 'SELECT analyze_statistics(''' || table_schema || '.' || table_name || ''');' FROM v_catalog.tables WHERE table_schema = '$1';" | /opt/vertica/bin/vsql -e > /home/dbadmin/analyze_schema_statistics.log 2>&1
exit 0
First, create the procedure in Vertica:
dbadmin=> CREATE PROCEDURE analyze_schema_statistics (schema_name VARCHAR) AS 'analyze_schema_statistics.sh' LANGUAGE 'external' USER 'dbadmin'; CREATE PROCEDURE
Next, find a schema to run it on:
dbadmin=> \dt test_stats.*
List of tables
Schema | Name | Kind | Owner | Comment
------------+------+-------+---------+---------
test_stats | t1 | table | dbadmin |
test_stats | t2 | table | dbadmin |
test_stats | t3 | table | dbadmin |
(3 rows)
Note that there are three tables in the TEST_STATS schema and all their projections have no statistics:
dbadmin=> SELECT projection_name, anchor_table_name, has_statistics FROM projections WHERE projection_schema = 'test_stats'; projection_name | anchor_table_name | has_statistics -----------------+-------------------+---------------- t1_super | t1 | f t2_super | t2 | f t3_super | t3 | f (3 rows)
Next, run the new procedure:
dbadmin=> SELECT analyze_schema_statistics('test_stats');
analyze_schema_statistics
---------------------------
0
(1 row)
Now all of the projections have statistics!
dbadmin=> SELECT projection_name, anchor_table_name, has_statistics FROM projections WHERE projection_schema = 'test_stats'; projection_name | anchor_table_name | has_statistics -----------------+-------------------+---------------- t1_super | t1 | t t2_super | t2 | t t3_super | t3 | t (3 rows)
Oh, the procedure also wrote out to a log file. Here are the contents of that log file:
dbadmin=> \! cat /home/dbadmin/analyze_schema_statistics.log
SELECT analyze_statistics('test_stats.t1');
analyze_statistics
--------------------
0
(1 row)
SELECT analyze_statistics('test_stats.t2');
analyze_statistics
--------------------
0
(1 row)
SELECT analyze_statistics('test_stats.t3');
analyze_statistics
--------------------
0
(1 row)
Have Fun!