AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 14679
Accepted
UB01
UB01
Asked: 2012-03-09 13:27:43 +0800 CST2012-03-09 13:27:43 +0800 CST 2012-03-09 13:27:43 +0800 CST

如何检索添加到表中的统计信息背后的定义

  • 772

有没有办法以编程方式检索添加到表列和索引的每个 STATISTICS 的定义。对于用户添加的和系统创建的索引。Sql Server 添加了许多统计信息,例如“__WA_Sys_*”。

我需要重写其中的一些并添加更多,但是有太多无法使用 Management Studio 手动完成。

sql-server-2008 sql-server-2005
  • 2 2 个回答
  • 236 Views

2 个回答

  • Voted
  1. Remus Rusanu
    2012-03-09T13:57:29+08:002012-03-09T13:57:29+08:00

    在sys.stats和之间,DBCC SHOW_STATISTICS您拥有查看统计数据所需的所有信息。例如。:

    set nocount on;
    declare @object nvarchar(256), @stat sysname;
    declare crs cursor forward_only read_only static for
    select quotename(object_schema_name(object_id)) + 
        '.' +quotename(object_name(object_id)), 
        name 
        from sys.stats;
    
    open crs;
    fetch next from crs into @object, @stat;
    while 0 = @@FETCH_STATUS
    begin
        dbcc show_statistics(@object, @stat) with NO_INFOMSGS, STAT_HEADER
        fetch next from crs into @object, @stat;
    end
    
    close crs;
    deallocate crs;
    

    话虽这么说,任何了解何时需要更新统计信息的人都已经知道如何查找它们,所以我敢猜测您不应该手动更新统计信息。

    • 7
  2. Best Answer
    Robert Carnegie
    2013-05-03T05:10:38+08:002013-05-03T05:10:38+08:00

    在http://www.toadworld.com/platforms/sql-server/w/wiki/9680.updating-statistics.aspx(好读)有一个我不完全理解的查询,但我把它转换成了这个,下面(SQL Server 2005)。输出:

    CREATE STATISTICS [IX_student_2012_1] ON [student_2012] ([student_key])
    CREATE STATISTICS [IX_student_2012_2] ON [student_2012] ([dbname], [id])
    CREATE STATISTICS [IX_student_2012_3] ON [student_2012] ([forename], [surname], [dob])
    CREATE STATISTICS [_WA_Sys_00000003_158238E1] ON [student_2012] ([surname])
    CREATE STATISTICS [_WA_Sys_00000051_158238E1] ON [student_2012] ([Own_coun])
    CREATE STATISTICS [_WA_Sys_00000010_158238E1] ON [student_2012] ([ethnic])
    

    显然其中一些来自索引。您可能可以改进查询以删除那些;你不需要副本。当然,您可以添加“WITH FULLSCAN”。

    我对这个很感兴趣,因为我们把企业数据连夜加载到一些数据库中,这样白天就可以运行报表。如果我在夜间运行期间生成一些统计数据——“WITH FULLSCAN”——那么报告将运行得更好,因为它们不需要进行统计。如果 SQL Server 创建统计信息,我不认为真的需要在列上创建索引,但我会考虑一下。事实上,我不明白[+]为什么在可以有索引的时候只有统计数据,但我认为这是有充分理由的![+]嗯,我明白了一点——否则那不是一篇很好的文章!

    罗伯特卡内基,喜欢索引!

    --Generate Statistics definitions for a given table.
    SELECT
          N'CREATE STATISTICS ' +
          QUOTENAME(s.name) +
          N' ON ' + 
          QUOTENAME(OBJECT_NAME(sc2.object_id)) +
          N' (' +
          SUBSTRING((SELECT ( ', ' + QUOTENAME(c1.name) )
           FROM sys.stats_columns sc1 JOIN sys.columns c1
                                ON sc1.object_id = c1.object_id
                                AND sc1.column_id = c1.column_id
    
                              WHERE sc1.object_id = sc2.object_id 
                                AND sc1.stats_id = s.stats_id
                               ORDER BY 
                                  sc1.stats_id,
                                  sc1.stats_column_id,
                                    c1.name
                               FOR XML PATH( '' )
                              ), 3, 4000 ) 
          +
          N')'
    FROM
    sys.stats_columns sc2 JOIN sys.columns c2
        ON sc2.object_id = c2.object_id
        AND sc2.column_id = c2.column_id 
    JOIN sys.stats s
        ON sc2.object_id = s.object_id
        AND sc2.stats_id = s.stats_id
    WHERE sc2.object_id = object_id('Student_2012') --substitute Tablename
    GROUP BY  
        sc2.object_id
       , s.name
       , s.stats_id
       , s.auto_created
    ORDER BY s.stats_id
    
    • 1

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve