我有一个很奇怪的问题(谁没有)。我们的 ETL 软件扫描源数据库以声明对象数据。它从 INFORMATION_SCHEMA 中提取有关对象(表和视图)的信息
SELECT
t.[TABLE_SCHEMA],
t.[TABLE_NAME],
c.[COLUMN_NAME],
c.[DATA_TYPE],
c.[CHARACTER_MAXIMUM_LENGTH],
c.[NUMERIC_PRECISION],
c.[NUMERIC_SCALE],
c.[DATETIME_PRECISION],
c.[ORDINAL_POSITION],
c.[IS_NULLABLE],
prim.[CONSTRAINT_NAME] AS [PRIMARY_KEY_NAME],
t.[TABLE_TYPE]
FROM [INFORMATION_SCHEMA].[TABLES] t
INNER JOIN [INFORMATION_SCHEMA].[COLUMNS] c
ON t.[TABLE_CATALOG] = c.[TABLE_CATALOG]
AND t.[TABLE_SCHEMA] = c.[TABLE_SCHEMA]
AND t.[TABLE_NAME] = c.[TABLE_NAME]
LEFT OUTER JOIN (
SELECT tc.[CONSTRAINT_NAME], tc.[CONSTRAINT_SCHEMA], tc.[CONSTRAINT_CATALOG], cc.[TABLE_NAME], cc.[COLUMN_NAME]
FROM [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] tc
INNER JOIN [INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE] cc
ON tc.[CONSTRAINT_NAME] = cc.[CONSTRAINT_NAME]
AND tc.[CONSTRAINT_SCHEMA] = cc.[CONSTRAINT_SCHEMA]
AND tc.[CONSTRAINT_CATALOG] = cc.[CONSTRAINT_CATALOG]
AND tc.[TABLE_NAME] = cc.[TABLE_NAME]
AND tc.[TABLE_CATALOG] = cc.[TABLE_CATALOG]
AND tc.[TABLE_SCHEMA] = cc.[TABLE_SCHEMA]
WHERE tc.[CONSTRAINT_TYPE] = 'PRIMARY KEY') prim
ON t.[TABLE_CATALOG] = prim.[CONSTRAINT_CATALOG]
AND t.[TABLE_SCHEMA] = prim.[CONSTRAINT_SCHEMA]
AND t.[TABLE_NAME] = prim.[TABLE_NAME]
AND c.[COLUMN_NAME] = prim.[COLUMN_NAME]
ORDER BY t.[TABLE_SCHEMA], t.[TABLE_NAME], c.[ORDINAL_POSITION]
对于大多数数据库(取决于对象和列的数量),这需要一分钟才能完成。对于一个特定数据库,这需要 10 到 35 分钟!我似乎不明白为什么。我无法更改上述查询(因为它嵌入在软件中),因此我正在寻找一种方法来提高该数据库的性能
该查询输出大约相同数量的记录。我检查了数据库配置,它们是完全相同的。当我使用“SET STATISTICS IO ON”进行测试时,很明显,与其他数据库相比,性能较差的数据库中发生了很多事情。我把它放在www.statisticsparser.com中,这就是性能较差的数据库的样子: 为了进行比较,这是普通数据库的样子:
我自己,我已经没有选择了。我尝试过清除过程和系统缓存(使用相应的 DBCC)并更新整个数据库的统计信息,但它(如预期的那样)没有效果。
任何帮助表示赞赏!
亲切的问候
编辑:我添加了查询计划,以与同一服务器上具有相同大小和结构的数据库进行比较(不存在性能问题: https: //file.io/ODajcfrzvGTP
它包含2个文件:_fast来自没有任何问题的数据库_slow来自有问题的数据库
@DanGuzman 和 @Sepupic 给出了答案。
主要更新系统对象统计信息有助于提高查询的持续时间,如本网站所述: https: //www.dbdelta.com/sql-server-system-table-statistics-update/