我有这两种创建表格和填充行的方法。第一个使用并行(3 级)子句,所以我预计插入速度会快得多。但我对 a) 和 b) 所用的时间进行了计时,结果几乎相同。没有迹象表明方法 a) 更快,实际上在某些运行中,方法 b) 更快。
我认为 parallel 子句会并行执行插入,因此速度要快得多。我在这里缺少什么?
一种)
create table TAB1
(col0 number not null,
col1 number,
col2 number,
col3 varchar2(25)) parallel (degree 3)
storage (initial 100K next 100K pctincrease 0);
begin
for i in 1..300000 loop
insert into TAB1 values(i-1,i,300000-i,null);
end loop;
commit;
end;
/
Run Code Online (Sandbox Code Playgroud)
b)
create table TAB2
(col0 number not null,
col1 number,
col2 number,
col3 varchar2(25))
storage (initial 100K next 100K pctincrease 0);
begin
for i in 1..300000 loop
insert …Run Code Online (Sandbox Code Playgroud) 这可以通过在查询选项中调用跟踪标志 8649 来完成。
OPTION (QUERYTRACEON 8649)
此跟踪标志导致查询的成本为 0,这将始终低于并行性的成本阈值,因此该查询将被视为并行计划。
试图以这种方式强制 T-SQL 查询使用并行性是否有任何缺点?
performance sql-server optimization parallelism t-sql query-performance
我有一个使用并行计划的数据透视查询,即使成本小于 5。
Parallelism 的成本阈值设置为默认值 5,MAXDOP 为 0。
SELECT Column1, Column2 Column3, Column4 AS Column5, Column6 Column7, Column8 Column9, Column10 Column11
FROM (
SELECT Column12,
Column13,
Column1
FROM Database1.Schema1.Object1
) Object2 PIVOT( SUM(Column13) FOR Column12 IN (Column2, Column4, Column6, Column8, Column10) ) AS pvtScore;
Run Code Online (Sandbox Code Playgroud)
以下屏幕截图显示估计的子树成本为 1.39。
我想知道为什么在成本阈值为 5 时使用并行计划以启动并行性。
版本:SQL Server 2008 R2
我有一个 SQL Server 查询如下(混淆):
UPDATE [TABLE1]
SET [COLUMN1] = CAST('N' AS CHAR(1))
FROM [TABLE1]
WHERE (COLUMN1 = '2' AND COLUMN2 IN('VAL1', 'VAL2', 'VAL3')) OR
(COLUMN1 <> 'N' AND (
SELECT COUNT(*)
FROM TABLE2 wle
JOIN TABLE3 wl
ON wl.COLUMN3 = wle.COLUMN3
WHERE TABLE1.COLUMN4 = wle.COLUMN4 AND
(wl.COLUMN5 = '1' OR wl.COLUMN6 = '1') AND
wle.COLUMN7 = (
SELECT MIN(alias.COLUMN7)
FROM TABLE2 AS alias
WHERE TABLE1.COLUMN4 = alias.COLUMN4
)
) > 0
)
Run Code Online (Sandbox Code Playgroud)
我们刚刚将我们的(测试)服务器从 SQL Server 2014 SP3 升级到 SQL Server …
首先 1 个线程从表中选择大量数据。
然后,在 SELECT 查询尚未完成之前,另一个线程从该表中删除数据。
它导致 SELECT 查询失败,错误 errorCode=1205 sqlState=40001 和发生死锁的消息。
我认为第二个事务必须等到第一个事务完成,或者第一个事务必须在没有第二个事务所做更改的情况下返回数据。我怎样才能避免这种情况?
我无法改变交易的顺序或以某种方式控制它们(应用程序的用户很多,他们可以随时以任何顺序做任何他们想做的事情)。为什么会发生?
查询是这样的(我对它们进行了一些混淆):
SELECT distinct P.pID, (LastNAME+' '+FirstName+' '+SurName) as NAME, 'person' as Type, CA.OrgName, PC.personemail as Email
FROM Persons P
INNER JOIN WORK PW ON (P.mainwork = PW.pwId)
INNER JOIN CONTACT PC ON (PC.pID = P.pID)
LEFT OUTER JOIN ORG CA ON (CA.orgId = PW.orgId)
WHERE (P.Status = ?)
Run Code Online (Sandbox Code Playgroud)
和
DELETE FROM persons WHERE id = 1234
Run Code Online (Sandbox Code Playgroud) 我将 Postgres 13.3 与内部和外部查询一起使用,它们都只产生一行(只是一些关于行数的统计数据)。
我不明白为什么下面的 Query2 比 Query1 慢得多。它们基本上应该几乎完全相同,最多可能只有几毫秒的差异......
WITH t1 AS (
SELECT
(SELECT COUNT(*) FROM racing.all_computable_xformula_bday_combos) AS all_count,
(SELECT COUNT(*) FROM racing.xday_todo_all) AS todo_count,
(SELECT COUNT(*) FROM racing.xday) AS xday_row_count
OFFSET 0 -- this is to prevent inlining
)
SELECT
t1.all_count,
t1.all_count-t1.todo_count AS done_count,
t1.todo_count,
t1.xday_row_count
FROM t1;
Run Code Online (Sandbox Code Playgroud)
我只添加了一行:
WITH t1 AS (
SELECT
(SELECT COUNT(*) FROM racing.all_computable_xformula_bday_combos) AS all_count,
(SELECT COUNT(*) FROM racing.xday_todo_all) AS todo_count,
(SELECT COUNT(*) …Run Code Online (Sandbox Code Playgroud) 我们在具有 8 个套接字和 20 个处理器的 VM 上托管了一个 UAT3 服务器,我们在具有相同配置的同一 VM 上托管了类似的 UAT2 服务器。
我们在两个服务器上运行以下查询
select recid from Table1 where nation='AE'
Run Code Online (Sandbox Code Playgroud)
两个服务器具有相同的数据和相同的结构。
UAT2 和 UAT3 具有默认设置并行度5 和最大并行度的成本阈值0。
IN UAT2 服务器并行处理正在发生。它需要 10 秒才能完成,但 UAT3 串行处理正在发生,因为它需要 3 分 30 秒。
我们比较 UAT2 和 UAT3 服务器配置都相同。不知道为什么 SQL Server 在 UAT2 中选择并行执行而不是在 UAT3 中。
下面是表定义
select recid from Table1 where nation='AE'
Run Code Online (Sandbox Code Playgroud)
下面是视图
CREATE TABLE [dbo].[FKMB_CUSTOMER](
[RECID] [nvarchar](64) NOT NULL,
[XMLRECORD] [xml] NULL,
[ALT_CUSTOMER] AS
([dbo].[IX_CUSTOMER_ALT_CUSTOMER]([XMLRECORD]))
PERSISTED,
[SMS] AS
([dbo].[IX_CUSTOMER_SMS_1]([XMLRECORD])) …Run Code Online (Sandbox Code Playgroud) 我使用定制的 Stack Overflow 数据库(180GB)并运行一个简单的更新查询:(Users 表上只有一个聚集索引)
Begin Tran
Update U set U.Reputation=100000
from StackOverflow.dbo.Users as U
where U.CreationDate = '2008-10-10 14:26:33.540'
Run Code Online (Sandbox Code Playgroud)
查询计划:
此查询会导致锁升级。我无法在另一个窗口中使用同一个表运行查询:
select * from StackOverflow.dbo.Users as U where U.id=11
Run Code Online (Sandbox Code Playgroud)
如果我option (maxdop 1)在查询末尾添加以避免并行,则一切都很好(计划)。
在较小的 Stack Overflow DB (StackOverflow2013 - 52GB) 中不会发生锁升级(计划)。
如何确定导致升级的数据量?
我使用 SQL Server 2019。数据库兼容级别为 150。
表信息:
如果我有两台服务器(服务器 A 和服务器 B)属于同一个可用性组故障转移集群,并且在服务器 A 上运行的查询具有使用并行化的执行计划,那么该查询是否可以使用处理器的内核在服务器 B 上?
sql-server parallelism clustering availability-groups sql-server-2017
UPDATE MARK M SET ARCHIVE_FLAG = 'N' WHERE EXISTS
(SELECT /*+ cardinality(S1, 10) parallel(S1,8)*/ 1 FROM SHFASG S, SHIFT S1
WHERE S.ID = S1.ID AND M.ID = S.MARKID AND ARCHIVE_FLAG <> 'Y');
Run Code Online (Sandbox Code Playgroud)
这是我拥有的 oracle 查询,我想为我的 MS SQL DB 创建类似的查询,请提供任何帮助
sql-server optimization parallelism cardinality-estimates query-performance
parallelism ×10
sql-server ×7
optimization ×2
clustering ×1
cte ×1
deadlock ×1
functions ×1
oracle ×1
performance ×1
postgresql ×1
t-sql ×1
transaction ×1