我有一个 SQL Server 2014 实例 (12.0.2000.8) 和一个非常复杂的 SELECT 语句,大约有 20 个连接。此查询在 PostgreSQL、Oracle 和其他数据库上的相同数据集上运行良好,整个执行大约需要 1 分钟。
但在 SQL Server 上大约需要 40 分钟。我试图查看执行计划并开始等待……我试图通过从应用程序会话执行查询来获取执行计划,但没有执行计划。
然后我得到了查询,在SQL Server Management Studio中询问“显示估计的执行计划”,我也开始等待。所以,看起来仅仅构建执行计划就花费了太多时间。所有统计数据都是用“exec sp_updatestats”收集的,我在 sys.stats 中检查了它 - 一切看起来都很好。所有索引都已就位。
我评论了所有的连接并开始一一取消注释,然后
SET STATISTICS TIME ON
Run Code Online (Sandbox Code Playgroud)
显示每个未注释的连接都需要更长的时间来解析,例如 13 个连接的时间:
SQL Server parse and compile time:
CPU time = 32250 ms, elapsed time = 32729 ms.
Run Code Online (Sandbox Code Playgroud)
所以,这绝对是一个解析问题。
select count(*) from sys.index_columns
where object_id in (OBJECT_ID('tables_names'),...')
Run Code Online (Sandbox Code Playgroud)
说有 128 列,当
select * from sys.indexes
where object_id in (OBJECT_ID('tables_names'),...')
Run Code Online (Sandbox Code Playgroud)
返回带有 HEAP、CLUSTERED、NONCLUSTERED 索引的 43 行。
你能推荐看什么吗?为什么要解析这么多? …
我正在尝试更改列的排序规则:
ALTER TABLE [dbo].[yourdad] ALTER COLUMN [yourmam] varchar(36) COLLATE SQL_Latin1_General_CP1_CI_AI NOT NULL;
Run Code Online (Sandbox Code Playgroud)
它给出了这样的消息:
消息 5074,级别 16,状态 1,第 1 行 对象“yourdad”依赖于列“yourmam”。消息 4922,级别 16,状态 9,第 1 行 ALTER TABLE ALTER COLUMN yourmam 失败,因为一个或多个对象访问此列。
它具有依赖于该列的分区模式和功能。
目前我喜欢超过 40k 的表,其中包含应该更改排序规则的列。
是否可以在不重新创建表格的情况下更改排序规则?
删除分区索引 - 删除。
但是当我尝试删除架构时:
删除分区方案你爸爸
消息 7717,级别 16,状态 1,第 1 行 分区方案“yourdad”当前正用于对一个或多个表进行分区。
这是我不想安装的数据库上的一种新的不区分大小写的数据库整理,旧的是 - 区分大小写。
Redhat 上有 Postgres 9.6 我想解释一下慢查询(相当复杂的一个),它需要太多时间。我与 EXPLAIN ANALYZE 的会话消耗了一个 CPU 的 100% 并且即使在 24 小时后也没有完成。Postgres无法建立执行计划如何分析问题?
是否可以通过sql_id获取当前正在运行的查询的执行计划?
我无法成功:
select
DBMS_SQL_MONITOR.REPORT_SQL_MONITOR
(sql_id=>'b3x6apqyskn7x') report
from dual;
Run Code Online (Sandbox Code Playgroud) sql-server ×2
collation ×1
explain ×1
optimization ×1
oracle ×1
partitioning ×1
performance ×1
postgresql ×1