列出所有索引
我想知道列出数据库中所有表的所有索引的最简单方法是什么。
我应该为每个表调用 sp_helpindex 并将结果存储在临时表中,还是有更简单的方法?
谁能解释为什么约束存储在 sysobjects 中而索引不存储?
I'm wondering what the simplest way to list all indexes for all tables in a database is.
Should I call sp_helpindex
for each table and store the results in a temp table, or is there an easier way?
Can anyone explain why constraints are stored in sysobjects but indexes are not?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
下面是您需要的查询类型的示例:
这个查询在某种程度上特定于特定目的(我在一个小型 C# 应用程序中使用它来查找重复索引并格式化输出,以便人类实际上可以读取)。 但您可以轻松地根据您的需求进行调整。
Here's an example of the kind of query you need:
This one is somewhat specific to a certain purpose (I use it in a little C# app to find duplicate indexes and format the output so it's actually readable by a human). But you could easily adapt it to your needs.
您可以参考 sysindexes
另一个技巧是查看 sp_helpindex 的文本了解它如何从基础表中重建信息。
我没有这方面的参考资料,但我相信约束不会存储在 sysobjects 中,因为它们是不同类型的东西; sysindexes 包含有关 sysobjects 中对象的元数据。
You could reference sysindexes
Another trick is to look at the text of sp_helpindex to see how it reconstructs information from the underlying tables.
I don't have a reference for this, but I believe constraints are not stored in sysobjects because they are a different kind of thing; sysindexes contains meta-data about objects in sysobjects.
如果您需要更多信息,这里有一个很好的 SQL 脚本,我时常使用它:
If you need more information, here is a nice SQL script, which I use from time to time:
下面是一个脚本,它将返回 SQL 语句以重新创建数据库中的所有索引。
Here is a script that will return SQL statements to recreate all the indexes in a database.
我没有明确解释为什么索引不存储在 sys.objects 中。 但我想帮助找到一种简单的方法来列出数据库中所有表和视图的所有索引。 以下查询检索所有索引,包括它们的类型以及它们的对象 ID 和对象类型。
I do not have a clear explanation why indexes are not stored in sys.objects. But I would like to contribute to find a simple way to list all indexes for all tables and views in a database. The following query retrieves all indexes including their type and also their object id and object type.
我编写了这段代码来迭代服务器中的所有数据库,并将其推送到名为 Maintenance 的数据库中的表中。 您应该首先创建此数据库,然后在该数据库中创建一个包含以下字段的表:
要使用下面的存储过程,您需要传入服务器名称。
usp_Execute_Stats '[您的服务器名称]'
I've written this code to iterate through all the databases in your server and push it to a table in a database named Maintenance. You should create this database first and then create a table in that database with the following fields:
To use the stored procedure below you'd pass in the server name.
usp_Execute_Stats '[YourServerName]'