gpt4 book ai didi

sql - 在 SQL 表上创建统计信息之前检查是否存在具有相同列的统计信息

转载 作者:行者123 更新时间:2023-12-01 12:50:46 25 4
gpt4 key购买 nike

我需要在具有不同列组合的表上创建一些统计信息。但是可能已经存在一些具有相同列组合的统计信息。因此,在使用列组合创建统计信息之前,我想检查是否存在具有相同列组合的统计信息。如果存在,那么我不会创建统计信息,如果不存在,那么我只会创建统计信息。

例如创建一个表并在该表上统计如下:

CREATE TABLE Gift
(
Gift_Id INTEGER IDENTITY (1,1) PRIMARY KEY,
Person_Id INTEGER,
Event_Id INTEGER,
Agent_Id INTEGER,
Fund_Id INTEGER,
Amount FLOAT
)

CREATE STATISTICS [Stats1_1_2_3]
ON [dbo].[Gift]([Gift_Id], [Person_Id], [Event_Id])

所以我们有一个表 Gift 和一个包含 Gift_ID、Person_Id 和 Event_Id 列的统计信息。

现在如果我创建另一个统计如下:

CREATE STATISTICS [Stats2_1_2_3] 
ON [dbo].[Gift]([Gift_Id], [Person_Id], [Event_Id])

稍后查看统计数据是第一个统计数据的副本(具有相同的列)。

因此,为了避免重复,我需要检查是否存在任何具有相同列的统计数据。

有什么办法吗?

请帮忙

最佳答案

下面的查询将检查 sys.stats、sys.stats_columns 和 sys.columns 表以查找给定表的所有统计信息并获取每个统计信息的每一列。分组统计是检查是否存在一个引用所有列的统计量。
请注意,该查询明确提及表名、列名和正在检查的列数。更新后的查询还检查是否仅列出的列存在(counting = 3)以及列出的所有列都存在(counting3 = 3)。用于其他统计信息将涉及修改 CASE 语句和最后 WHERE 行中的“3”值。

SELECT * FROM (
SELECT s.name AS statistics_name,
count(*) as counting,
sum(case
when c.name = 'Gift_Id' then 1
when c.name = 'Person_Id' then 1
when c.name = 'Event_Id' then 1
else 0
end) as counting3
FROM sys.stats AS s
INNER JOIN sys.stats_columns AS sc
ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id
INNER JOIN sys.columns AS c
ON sc.object_id = c.object_id AND c.column_id = sc.column_id
WHERE s.object_id = OBJECT_ID('Gift')
Group by s.name) T
WHERE T.COUNTING = 3 AND T.COUNTING3 = 3;

Updated SQLFiddle for the above

关于sql - 在 SQL 表上创建统计信息之前检查是否存在具有相同列的统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51574782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com