查找 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
【问题讨论】:
这列出了所有数据类型为 bigintselect * 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 时)