查找 pk 为 int(不是 bigint)的最大表

Posted

技术标签:

【中文标题】查找 pk 为 int(不是 bigint)的最大表【英文标题】:Find biggest tables where pk is int (not bigint) 【发布时间】:2021-09-07 07:55:39 【问题描述】:

我想查找行数最多的表,并排除具有 bigint 主键的表。

下面的查询运行得非常快并且似乎可以正常工作,但是如何修改它以过滤掉 bigint 表?我也许可以忽略大于 MAX_INT 的 row_counts,但如果表是 bigint 但还没有很多行,那将不起作用。

SELECT      SCHEMA_NAME(O.schema_id) + '.' +
        O.Name As [Schema.TableName], SUM(P.rows) AS 'Total_RowCount'
FROM        sys.objects O
INNER JOIN sys.partitions P ON O.object_id = P.object_id
WHERE     O.type = 'U'
        AND P.index_id<2  
GROUP BY    O.schema_id, O.Name
order by Total_RowCount desc

【问题讨论】:

这列出了所有数据类型为 bigint select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'bigint'的列 OP 最好使用其他 sys 对象,因为它们已经在使用 sys 对象。此外,这只会省略一个表,其中 any 列是 bigint,而不是主键 @Nick.McDermaid。 正确。如果我有一个完整的解决方案(我很少这样做),我会发布作为答案。是的,始终坚持使用老式(sys)或现代(信息模式)API 是有意义的 @Nick.McDermaid sys 对于 SQL Server 来说更现代,而不是 INFORMATION_SCHEMA... 后者省略了很多关于对象的信息。 【参考方案1】:

您可以在WHERE 中使用NOT EXISTS,并对主键列的sys.types 对象进行横向连接。我假设如果一个 PK 由多列组成,其中之一是 bigint 你想省略它:

SELECT SCHEMA_NAME(o.schema_id) + '.' + o.name AS [Schema.TableName],
       SUM(p.rows) AS Total_RowCount
FROM sys.objects o
     INNER JOIN sys.partitions p ON o.object_id = p.object_id
WHERE o.type = 'U'
  AND p.index_id < 2
  AND NOT EXISTS (SELECT 1
                  FROM sys.indexes i 
                       JOIN sys.index_columns ic ON o.object_id = ic.object_id
                                                AND i.index_id = ic.index_id
                       JOIN sys.columns c ON o.object_id = c.object_id
                                         AND ic.column_id = c.column_id
                       JOIN sys.types ct ON c.system_type_id = ct.system_type_id
                  WHERE o.object_id = i.object_id
                    AND i.is_primary_key = 1
                    AND ct.[name] = 'bigint')
GROUP BY o.schema_id,
         o.name
ORDER BY Total_RowCount DESC;

【讨论】:

以上是关于查找 pk 为 int(不是 bigint)的最大表的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中的 CASE 强制列数据类型为 BIGINT 而不是 INT

MySQL中数字类型的最大值 - int无法储存11位手机号码 - bigint, int, tinyint

MySQL中数字类型的最大值 - int无法储存11位手机号码 - bigint, int, tinyint

Postgresql 查找每个类型的最大 transaction_id 给出重复项(当它不应该用于 PK 时)

是不是只有int,bigint,smallint,tinyint类型的在SQL语句中不用单引号

Mysql中有类似merge into的函数吗?