最有用的SQL元查询

时间:2010-02-23 21:05:19

标签: sql mysql sql-server oracle

我对元查询充满热情,我指的是回答关于数据的问题的查询,而不是使用数据回答。< / p>

在我得到许多合理的批评之前,我确实意识到元查询的方法并不理想,例如,如{1}所述。不过,我相信他们确实有自己的位置。 (以至于我创建了一个支持SQL Server,Oracle和MySql的参数化元查询的WinForms用户控件,并且我在Simple-Talk上发布的here中广泛描述了此QueryPicker的设计和使用。 COM。)

我使用元查询的动机:

  1. 当我坐下来使用新数据库并希望了解它时,我会使用元查询进行探测。最常见的是那些让我回答有关字段和表格的问题的内容,例如“其他表中有哪些'xyz'字段?”或“什么表有标识列?”或“这张桌子的钥匙是什么?”
  2. 我经常使用多种数据库类型(SQL Server,Oracle,MySql)和 - 练习懒惰的优秀编程理想 - 我不想每次需要时都要查找或记住一个神秘的SQL配方。我想指向并点击。
  3. 当然还有其他(更好的?)方法来获取元信息 - 用于给定的数据库类型。特别是SQL Server提供SQL Server Management Studio。 Oracle和MySql工具似乎没有提供相同的用途。 (我自由地承认,我用我的SQL-Server-leaning-view of the universe做出了这个主张。:-)即使他们这样做了,他们也会有所不同 - 我想要跨数据库类型的统一方法 EM>


    所以,最后,问题是:

    哪些SQL Server,Oracle或MySql元查询认为有用?


    摘要矩阵

    这个第一个视图总结了我的集合到目前为止数据库类型(并且正如我所说,对SQL Server的重点加权)。

    Query                            SQL Server    Oracle     MySql
    
    DB Version                           yes        yes        yes
    Databases with properties            yes                   yes
    Databases with space usage           yes
    National Language Support                       yes
    Procedures and functions             yes                   yes
    Primary keys                         yes                   yes
    Primary to foreign keys              yes
    Session Information/brief            yes
    Session Information/details          yes
    Session SET options                  yes
    Users and Roles                      yes
    Currently running statements         yes
    Constraints                          yes
    Indexes                              yes
    Column info/brief                    yes        yes        yes
    Column info/details                  yes        yes        yes
    Object level details                 yes
    Rows and space used                  yes
    Row/column counts                    yes
    Non-empty tables                     yes        yes        yes
    Show table schema                    yes        yes
    Seed/max values                      yes
    

    按数据库类型引用

    我自己开发了一些这些元查询,但很多来自社区论坛。第二个视图在适当的位置逐项列出了源URL。

    SQL Server

    System Category
    -----------------
        DB Version
        Databases with properties    http://www.mssqltips.com/tip.asp?tip=1033
        Databases with space usage   http://www.sqlservercentral.com/Forums/Topic261080-5-1.aspx
        Procedures and functions
        Primary keys                 http://databases.aspfaq.com/schema-tutorials/schema-how-do-i-show-all-the-primary-keys-in-a-database.html
        Primary to foreign keys      http://www.sqlservercentral.com/scripts/Miscellaneous/61481/
        Session Information/brief    http://www.sqlservercentral.com/blogs/glennberry/archive/2009/12/28/how-to-get-a-count-of-sql-connections-by-ip-address.aspx
        Session Information/details  http://www.mssqltips.com/tip.asp?tip=1817
        Session SET options
        Users and Roles              http://www.sqlservercentral.com/scripts/users/69379/
        Currently running statements http://www.sqlservercentral.com/articles/DMV/64425/
        Constraints
        Indexes                      http://www.sqlservercentral.com/scripts/Index+Management/63932/
    
    Column Category
    -----------------
        Column info/brief
        Column info/details
    
    Table Category
    -----------------
        Object level details
        Rows and space used          http://www.mssqltips.com/tip.asp?tip=1177
        Row/column counts
        Non-empty tables
    
    DDL Category
    -----------------
        Show table schema            http://www.sqlservercentral.com/scripts/Create+DDL+sql+statements/65863/
    
    Data Category
    -----------------
        Seed/max values
    

    的Oracle

    System Category
    -----------------
        DB Version
        National Language Support
    
    Column Category
    -----------------
        Column info/brief
        Column info/details
    
    Table Category
    -----------------
        Non-empty tables
    
    DDL Category
    -----------------
        Show table schema
    

    MySQL的

    System Category
    -----------------
        DB Version
        Databases
        Procedures and functions
        Primary keys                 http://databases.aspfaq.com/schema-tutorials/schema-how-do-i-show-all-the-primary-keys-in-a-database.html
    
    Column Category
    -----------------
        Column info/brief
        Column info/details
    
    DDL Category
    -----------------
        Show table schema
    

6 个答案:

答案 0 :(得分:1)

我在SQL Server上经常使用其中一些,包括但不限于:

  • 没有主键的表
  • 没有聚集索引的表
  • 没有任何索引的表
  • 标量用户定义的非确定性函数
  • 没有扩展属性“MS_Description”的数据库对象(默认的“描述”属性,对生成文档很有用)
  • 空的架构
  • 没有标准文档/评论块的SQL模块(视图,过程,函数,触发器)

系统特定的:

  • 包含对缺少的存储过程或视图的引用的配置表
  • 基于无法进行模式绑定或验证的表/视图的视图(因为它们基于另一个数据库中的视图/表)
  • 系统中未使用的视图中的列
  • 某些没有默认值的NULLable列
  • 可以为NULL的数字列

答案 1 :(得分:1)

Oracle SQL Developer有一组包含这些类别的内置报告。我扩展了其中一个类别。

About Your Database
All Objects
Application Express
ASH and AWR
Database Administration
  All Tables
  Cursors
  Database Parameters
  Locks
  Memory
  Sessions
  Storage
  Top SQL
  Users
  Waits and Events
Data Dictionary
Jobs
PLSQL
Security
Streams
Table
XML

这些是一些实际的报告名称,

Tables without Indexes
Tables without Primary Keys
Tables with Unindexed Foreign Keys
Largest Average Row Length
Most Rows
Unusable Indexes

还有更多报道可供使用。

答案 2 :(得分:0)

在Oracle上,最有用的是关于正在运行的会话上的等待的v$session上的那个,这意味着,当时正在进行的会话是什么(从光盘读取,等待锁定,......)< / p>

答案 3 :(得分:0)

Oracle有大量的元数据视图,可能是我查询最多的是DBA_OBJECTS,可以查询各种不同的对象类型。可以从其他视图获得相同的信息和更多信息(例如,有关表的更多信息可以在DBA_TABLES中找到)。

可以在here找到对Oracle数据字典的概述。

答案 4 :(得分:0)

关于在互联网上使用一套固定脚本的担忧是“这不是你所知道的,而是你所知道的并非如此,或者不再如此。”人们需要确保在提升脚本时它的版本是否合适。例如,从10.1或10.2开始的Oracle可以将列设置为UNUSED。它仍然显示在DBA_TAB_COLUMNS中,但它不再存在了。

最好理解数据字典中的内容 - 特别是在Oracle中,数据库参考(V $,DBA_ *)的内容以及PL / SQL包和类型参考,因为越来越多的功能朝着这个方向发展(例如DBMS_STATS包取代ANALYZE语句)

Oracle中一些更深奥但有用的内容:

DICT --数据字典中每个表\视图的名称和简要说明。

DBA_TAB_MODIFICATIONS --自上次分析以来,哪些表具有多少插入/更新/删除流量。

V$OBJECT_USAGE --一起使用时,

ALTER INDEX ... MONITORING USAGE显示自启用监视以来哪些索引未在SQL语句中使用。 (用于支持外键或唯一约束的索引可能不会出现,但可能已被“使用”了。)

V$SESSION_LONGOPS --哪些SQL语句正在运行“长时间运行”操作,例如完整扫描,排序和合并,以及Oracle在完成之前认为它将持续多长时间。

DBA_HISTOGRAMS --您的数据存在什么偏差

DBA_OBJECTS --它有一切

DBA_SOURCE (by line)/ DBA_TRIGGERS (by block)--系统中的所有可执行代码。

答案 5 :(得分:0)

msorens,

我完全同意你的看法。了解数据和架构有助于您更好地编码,更好地避免错误,识别特殊情况并分析需求。

您可以查看我的其他帖子:
Compare two schemas and update the old schema with the new columns of new schema

我的架构比较脚本是有关Oracle目录视图的信息。不幸的是它并不完整,但这是另一天的任务。 ; - )

马修