嗨,我一直在编写一个脚本来更新我所有数据库上所有表的统计信息。这个想法是稍后对其进行参数化,但作为一个快速解决方案,今天不想实施Ola 的脚本,请按照下面的脚本进行操作。
我已经在几台服务器上对其进行了测试,但在我安排它在周日早上在实时服务器上运行之前,想获得一些想法并与您分享。
SET NOCOUNT ON
DECLARE @DBS TABLE (I INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
DBNAME SYSNAME NOT NULL )
DECLARE @I INT
,@Z INT
,@SQL VARCHAR(1008)
,@j INT
,@Y INT
,@MYDB SYSNAME
INSERT INTO @DBS
SELECT s.name
FROM sys.databases s
INNER JOIN SYS.master_files F ON S.DATABASE_ID = F.database_id AND F.data_space_id = 1
WHERE S.STATE = 0 -- online
AND S.database_id > 3 -- exclude master, tempdb and model -- I left msdb
AND S.is_read_only = …Run Code Online (Sandbox Code Playgroud) 在 SQL Server 2012 SP1 实例中,我在表的 PK 列上有一个筛选索引,如下所示:
CREATE INDEX [RF_IXF_Orders_OrderNumber] ON [dbo].[Orders]
(
[OrderNumber] ASC
)
WHERE [OrderSource]='MO'
AND [Cancelled]=(0)
AND [NumItems]>(0)
AND [OrderDate]>'2014-05-15';
Run Code Online (Sandbox Code Playgroud)
索引的 Row Count (dm_db_partition_stats.row_count) 为 8416,Rows Changed (sysindexes.rowmodctr) 为 16803 (193.6%),Auto Update Statistics 为 True。有 8400 个 user_scans 和 50,088 个 user_updates。上次 user_scan 是今天,但统计数据已经大约一周没有更新了。
为什么统计数据不会自动更新?
Microsoft 购买 REvolution 结果(除其他外)将 R 集成到 SQL Server 2016 中。
查看SQL Server 2016 支持的功能,我找不到 R-Support。有谁知道 R-Integration 属于什么功能或哪个版本集成了这个功能?
我试图在 Postgres 9.5 中从这个查询中挤出更多的性能。我正在运行超过 400,000 行。
在玩弄它时,我注意到这些CASE语句增加了相当多的查询成本 - 如果我用简单地对一些现有列求和来替换它们,它会将执行时间减半。有没有更有效的方法来计算这些总和?
SELECT sum("tag1"), sum("tag2"), sum("total_tags")
FROM (
SELECT people.data->'recruiter_id' AS recruiter_id,
(CASE WHEN people.data->'tags' ? 'tag1' THEN 1 END) AS "tag1",
(CASE WHEN people.data->'tags' ? 'tag2' THEN 1 END) AS "tag2",
((CASE WHEN people.data->'tags' ? 'tag1' THEN 1 ELSE 0 END) +
(CASE WHEN people.data->'tags' ? 'tag2' THEN 1 ELSE 0 END)) AS total_tags
FROM people WHERE people.data->'tags' ?| ARRAY['tag1','tag2'] ) AS target
GROUP BY recruiter_id
Run Code Online (Sandbox Code Playgroud)
的输出EXPLAIN ANALYSE: …
postgresql performance statistics execution-plan json postgresql-performance
我正在运行一些测试以找出更新统计信息后查询计划何时失效。我用于测试的机器是 SQL Server Developer 2016 SP1 CU7。
我在BrentOzar.com上找到了一篇关于如何跟踪重新编译的文章,但我从未得到重新编译。
Auto Update Statistics并且Auto Create Statistics都启用
这是我的测试:
/* Create a table and put over 1k rows in it (to get past the 500 row stats threshold) */
CREATE TABLE dbo.MyTable (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, StringField VARCHAR(50));
GO
INSERT INTO dbo.MyTable(StringField)
SELECT 'Stuff' FROM sys.all_objects;
GO
/* Start a trace monitoring recompiles */
exec sp_BlitzTrace @Action='start', @TargetPath='c:\temp\', @SessionId=@@SPID, @TraceRecompiles=1;
GO
SELECT * FROM dbo.MyTable WHERE StringField = …Run Code Online (Sandbox Code Playgroud) 您应该多久更新一次统计数据?什么是“太少”?“太频繁”有多频繁?
答案是“这取决于”您的数据库、用户、数据等。
所以我试图在两个表中记录我们的统计数据随着时间的推移是什么样的。他们来了:
DROP TABLE /*IF EXISTS */ dbo.dm_db_stats_histogram
DROP TABLE /*IF EXISTS */ dbo.dm_db_stats_properties
go
CREATE TABLE dbo.dm_db_stats_properties(
dm_db_stats_propertiesID INT IDENTITY(1,1) NOT NULL constraint PK_dm_db_stats_properties PRIMARY KEY CLUSTERED,
DatabaseId INT NOT NULL,
object_id int NOT NULL,
stats_id int NOT NULL,
last_updated DATETIME2 NOT NULL,
rows BIGINT NOT NULL,
rows_sampled BIGINT NOT NULL,
steps int NOT NULL,
unfiltered_rows BIGINT NOT NULL,
modification_counter BIGINT NOT NULL,
persisted_sample_percent FLOAT NULL
, SampleDate DATETIME2 NOT NULL CONSTRAINT df_dm_db_stats_properties_SampleDate DEFAULT SYSUTCDATETIME()
)
GO
ALTER …Run Code Online (Sandbox Code Playgroud) sql-server-2008 sql-server statistics azure-sql-database sql-server-2017
我正在查看表(pg_stat_user_indexes和pg_stat_user_tables)并发现许多未使用的索引。
但在我考虑执行任何操作来删除这些索引之前,我需要了解此数据的分析时间段(idx_scan),是自数据库创建以来的时间段吗?
在pg_stat_database ( stats_reset ) 表中,有一个日期通常是今天或最多 15 天前,但是这个过程是否会干扰我上面提到的表?
%reset() 命令是否清除表(pg_stat_user_indexes和pg_stat_user_tables)?
我的目标是了解收集数据的时间段,以便我可以做出决定。
我创建了一个示例表,如下所示
CREATE TABLE [dbo].[StatisticsDemo](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
然后我插入以下数据如下:
SELECT NAME,COUNT(*) AS COUNT
FROM StatisticsDemo
GROUP BY NAME
NAME COUNT
-------------
AABBCC 59999
XXYYZZ 1
Run Code Online (Sandbox Code Playgroud)
然后我在下面创建了非聚集索引:
CREATE NONCLUSTERED INDEX [NCI_STATISTICSDEMO_NAME] ON [dbo].[StatisticsDemo]
(
[Name] ASC
)
Run Code Online (Sandbox Code Playgroud)
现在我运行了以下查询:
SELECT NAME FROM [dbo].[StatisticsDemo]
WHERE NAME = 'AABBCC'
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它返回 59999 行,但它正在对非聚集索引进行索引查找。但据我所知,它应该进行索引扫描,因为 99.99% 的数据满足选择查询中提到的过滤条件。
有人能告诉我为什么它在做索引搜索而不是索引扫描吗?
整个活动的目的是证明(正如我将要介绍的统计数据)SQL Server 在准备执行计划之前查看统计数据以识别符合查询过滤条件的记录数,并基于百分比记录匹配表中的总记录,它将决定执行扫描或搜索。如果匹配记录的百分比大约等于表中的记录总数,则应执行 SCAN。但这并没有发生。当我使用 AdventureWorks2016 数据库并运行以下查询时也是如此:
select * from [Sales].[SalesOrderHeader] WHERE SalesOrderID >= 43659 AND
SalesOrderID <= 73659
Run Code Online (Sandbox Code Playgroud)
上面的查询返回 31465 条记录中的 30001 …
我有一个包含 17,093,139 行的大堆表。该表是数据库中使用最频繁的表。由于这是一个堆表,因此该表中只有非聚集索引。我定期重建/重组这个表上的碎片索引。
现在我们经常面临这个问题:访问此表的大量查询突然开始比平时花费更长的时间。当我检查时,我观察到查询的执行计划已更改。
我创建并删除了一个随机的非聚集索引,这解决了这个问题。
我不明白的是,是什么导致这些突然突然变慢的原因是什么,创建和删除索引在后台对表做了什么来修复它,而索引重建作业没有做?
我需要找出究竟是什么触发了这些减速,以便找到一个永久的解决方案,因为我不能只是每次都继续创建和删除索引来解决这个问题。
这里的任何帮助将不胜感激。
sql-server statistics index-tuning amazon-rds query-performance
问题的快速背景:我们有一个应用程序,我们有许多为客户端运行的应用程序实例。虽然它们的版本可能略有不同,但它们基本上是相同的。
昨天,一位客户遇到了 SQL 超时问题。查看查询,我们发现某些表存在问题,并使用OUTER APPLY并重新编写它来规避该问题。
今天检查查询计划,我可以清楚地看到统计数据很糟糕,因为它预计大约有 250 万行,这是不正确的。我更新了统计数据,它已经解决了这个问题,现在预计有 30 行。
我的困惑来自于我检查其他客户数据库的查询计划时,统计信息似乎关闭,但是,查询在大约 1 秒内返回,而不是在所面临的问题中看到的 45 秒。
两个数据库都打开了自动统计。这是否表明问题数据库上的自动统计有问题?
在测试时,我确实清除了缓存,DBCC FREEPROCCACHE因此引擎每次都必须生成一个计划。但是,我没有在及时返回数据的数据库上执行此操作。
抱歉含糊不清,很遗憾,由于敏感信息,我无法分享查询计划。
目前,我们只运行自动统计更新(没有预定的统计/索引维护)。这会改变;数据库在某种程度上被忽视了。我还应该提到,这些数据库在 Azure 中。我不确定这是否会改变什么?
statistics ×10
sql-server ×6
postgresql ×2
amazon-rds ×1
index ×1
index-tuning ×1
json ×1
performance ×1
r-language ×1