AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-99331

jesijesi's questions

Martin Hope
DMDM
Asked: 2024-06-10 18:07:29 +0800 CST

即使禁用了所有相关表的 auto_stats,SP 仍会以“统计信息已更改”原因重新编译

  • 6

我正在排除性能故障,我需要一个 SP 来停止因为自动更新统计数据而重新编译。

我不想禁用整个数据库的自动统计信息更新,所以我认为可以使用sp_autostatsproc 禁用所有相关表的自动统计信息更新。但即使在我禁用所有相关表的自动统计信息更新后,它仍然会重新编译,原因是“统计信息已更改”。

我检查了上次更新统计数据的时间,并使用了 auto_stats 扩展事件来跟踪统计数据是否已更新,但事实并非如此。

瑞普罗

USE [test]
GO
CREATE TABLE [dbo].[test](
    [a] [int] IDENTITY(1,1) NOT NULL,   [b] [int] NULL, [c] [int] NULL,
PRIMARY KEY CLUSTERED 
(
    [a] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = ON, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [idx] ON [dbo].[test]
(
    [c] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = ON, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE proc [dbo].[sp1] @a int
as
select * from  test  where c=@a  order by b
GO
sp_autostats 'test','off'
go

--creating lots of changes.
--Session 1
set nocount on 
while 1=1
begin
delete top(1) from test
end

--Session 2
set nocount on 
while 1=1
insert into test select 1, FLOOR(RAND() * (10 - 1 + 1)) + 1;

--powershell 3.  Calling the SP in a loop
while ($true) {
    
        $sqlQuery = "EXEC test.dbo.sp1 @a=100;"
        Invoke-Sqlcmd -ServerInstance 'sql1\s14' -Database 'test' -Query $sqlQuery -Encrypt Optional
        Start-Sleep -Milliseconds 500
}

--Monitor sql_statement_recompile extended event.  Should see a recompile event in a couple minutes with "Statistics changed" as recompile_cause
CREATE EVENT SESSION [test] ON SERVER 
ADD EVENT sqlserver.sql_statement_recompile(SET collect_object_name=(1),collect_statement=(1)
    ACTION(sqlserver.server_principal_name,sqlserver.sql_text))
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

我怀疑这可能与为排序创建的工作表上的统计信息有关?如果我们注释掉 SP 中的 order by 子句,问题就会消失。定期调用sp_recompile似乎还会重置触发重新编译的跟踪内容。

有什么解决方法吗?还有其他人遇到过这个问题吗?

sql-server
  • 1 个回答
  • 117 Views
Martin Hope
jesijesi
Asked: 2020-01-29 20:00:55 +0800 CST

并行运行 sys.dm_db_index_physical_stats

  • 3

我正在尝试获取一些超过 500 GB 的表的碎片信息,并且我正在...DETAILED使用sys.dm_db_index_physical_stats. 我在我们的 pre-Prod 服务器上的生产数据库的还原副本上执行此操作,因此我不在乎损害服务器上的任何性能。

我运行了它,它看起来像是在串行运行并且它需要永远。有没有办法dm_db_index_physical_stats()并行运行?还是有其他设置干扰它?

我猜在 SQL Server 2014DBCC TRACEON (8649)中OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))不可用。

DBCC SETCPUWEIGHT(1000);也从 Paul White 的博客中尝试过。该博客提到了并行抑制器,其中之一是系统表。算不算dm_db_index_physical_stats()系统表?

sql-server performance
  • 1 个回答
  • 289 Views
Martin Hope
jesijesi
Asked: 2019-06-17 23:21:04 +0800 CST

Service Pack 是否具有累积更新中的所有更改

  • 5

我一直认为 CU 中的所有更改都会汇总到下一个服务包中。我最近正在研究SQL 2016 SP2和SQL 2016 CU15 for SP1的变化。

令我惊讶的是,SP2 中没有提到 SP1CU15 中的 KB。我错过了什么?

sql-server sql-server-2016
  • 1 个回答
  • 403 Views
Martin Hope
jesijesi
Asked: 2018-10-20 13:40:27 +0800 CST

死锁 - 由于更新导致索引内的索引页面移动

  • 2

我仍在对这个问题中提到的死锁进行故障排除。在这方面,我得到了帮助,理解了为什么 select 会持有共享锁,并且我也能够测试并确认这一点。

现在我正在查看陷入僵局的第二个 spid。该会话使用主键进行更新(WHERE BatchId = @BatchI,BatchId 是 PK)并且它需要在两个页面上使用 IX。最初我不明白为什么它只更新一行时需要锁定非聚集索引的两页。然后我意识到对该行的更新将更改该行在非聚集索引中的位置,这可能是它需要在两个页面上锁定的原因。

那是对的吗?

其次,请帮助确认我对这个僵局的理解是正确的。为简单起见,我们假设该非聚集索引中只有两个页面。第 1 页和第 2 页。这就是正在发生的事情吗 在此处输入图像描述

sql-server performance
  • 1 个回答
  • 487 Views
Martin Hope
jesijesi
Asked: 2018-10-15 21:05:07 +0800 CST

死锁故障排除,受害者持有共享锁

  • 1

我正在尝试解决以下死锁情况 在此处输入图像描述

查看死锁 xml,两个会话都使用读取提交隔离级别。问题是,在读提交隔离级别,在这种情况下,为什么受害者会持有共享锁?我的理解和我刚刚测试过的是,在读取表时,它会在页/行级别获取共享锁,然后立即释放它。在读提交隔离级别的什么情况下,会话会想要持有它已获取的页面上的共享锁?

所有锁都位于表的非聚集索引上。

<deadlock>
    <victim-list>
        <victimProcess id="process11634c19088" />
    </victim-list>
    <process-list>
        <process id="process11634c19088" taskpriority="0" logused="0" waitresource="PAGE: 11:13:52372905 " ownerId="57900000774" transactionname="SELECT" lasttranstarted="2018-10-12T09:48:05.360" XDES="0x3e7feedc00" lockMode="S" schedulerid="12" kpid="8544" status="suspended" spid="72" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2018-10-12T09:48:05.360" lastbatchcompleted="2018-10-12T09:48:05.377" lastattention="1900-01-01T00:00:00.377" clientapp=".Net SqlClient Data Provider" hostname="hostname1" hostpid="6912" loginname="ENETTAD\SVC_APP" isolationlevel="read committed (2)" xactid="57900000774" currentdb="11" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056" databaseName="database1">
            <executionStack>
                <frame procname="database1.dbo.uspBatch_Search" line="88" stmtstart="5068" stmtend="7128" sqlhandle="0x03000b00fad68c201937da0036a9000001000000000000000000000000000000000000000000000000000000">
SELECT @TotalRowCount = COUNT(*)    
  FROM dbo.Batch     
  JOIN #child ce    
   ON ce.ECN = requestednce    
  WHERE BatchId = ISNULL(@BatchId, BatchId)    
   AND RequestedUsername = ISNULL(@RequestedUsername, RequestedUsername)    
   AND requestednce = ISNULL(@requestednce, requestednce)    
   AND BatchStatusId = ISNULL(@StatusId, BatchStatusId)    
   AND BatchStatusId != @NewStatusId   and  BatchStatusId != @CancelledStatusId    
   AND (  (@IsReportRequired = @true AND ReportBlobId IS NOT NULL)     
   OR (@IsReportRequired = @false))    
   AND ( (     
   (@DateType = @CreatedDate AND CreatedDate BETWEEN cast(@FromDate AS varchar(20)) AND cast(@ToDate AS varchar(20)) )    
    OR     
   (@IncludeCurrent = @true AND ( BatchStatusId IN (@QueuedStatus,@InProgressStatus,@ReportingStatus)     
      OR     
       CompletedDate BETWEEN cast(@FromDate AS varchar(20)) AND cast(@ToDate AS varchar(20)))  )    
  )     
  OR @DateType = @IgnoreDateRange    </frame>
                <frame procname="adhoc" line="1" stmtstart="386" sqlhandle="0x01000b005101d12e207be87f2100000000000000000000000000000000000000000000000000000000000000">
EXEC @RETURN_VALUE = [dbo].[uspBatch_Search] @ECN = @p0, @BatchId = @p1, @requestednce = @p2, @RequestedUsername = @p3, @DateType = @p4, @FromDate = @p5, @ToDate = @p6, @StatusId = @p7, @IsReportRequired = @p8, @IncludeCurrent = @p9, @StartRowIndex = @p10, @SortExpression = @p11, @MaximumRows = @p12, @TotalRowCount = @p13 OUTPUT    </frame>
                <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
            </executionStack>
            <inputbuf>
(@p0 int,@p1 int,@p2 int,@p3 varchar(8000),@p4 varchar(8000),@p5 datetime,@p6 datetime,@p7 int,@p8 tinyint,@p9 bit,@p10 int,@p11 varchar(8000),@p12 int,@p13 int output,@RETURN_VALUE int output)EXEC @RETURN_VALUE = [dbo].[uspBatch_Search] @ECN = @p0, @BatchId = @p1, @requestednce = @p2, @RequestedUsername = @p3, @DateType = @p4, @FromDate = @p5, @ToDate = @p6, @StatusId = @p7, @IsReportRequired = @p8, @IncludeCurrent = @p9, @StartRowIndex = @p10, @SortExpression = @p11, @MaximumRows = @p12, @TotalRowCount = @p13 OUTPUT   </inputbuf>
        </process>
        <process id="process2e950984e8" taskpriority="0" logused="10880" waitresource="PAGE: 11:13:14044552 " waittime="241" ownerId="57900000848" transactionname="user_transaction" lasttranstarted="2018-10-12T09:48:05.367" XDES="0xf7c3c0c3b0" lockMode="IX" schedulerid="2" kpid="5476" status="suspended" spid="234" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2018-10-12T09:48:05.370" lastbatchcompleted="2018-10-12T09:48:05.367" lastattention="1900-01-01T00:00:00.367" clientapp=".Net SqlClient Data Provider" hostname="hostname1" hostpid="6912" loginname="ENETTAD\SVC_APP" isolationlevel="read committed (2)" xactid="57900000848" currentdb="11" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056" databaseName="database1">
            <executionStack>
                <frame procname="database1.dbo.uspBatch_Update" line="32" stmtstart="1934" stmtend="2586" sqlhandle="0x03000b00b243467b8df206000ba7000001000000000000000000000000000000000000000000000000000000">
UPDATE Batch      
            SET  BatchStatusId = @BatchStatusId,      
            ReportBlobId = @ReportBlobId,      
            CompletedDate = @CompletedDate,    
            ImportReportVersion = @ImportReportVersion,    
            ExportReportVersion = @ExportReportVersion,  
            ErrorCode = @ErrorCode  
            WHERE BatchId  = @BatchI    </frame>
                <frame procname="adhoc" line="1" stmtstart="236" sqlhandle="0x01000b009c24d728c05a7d06ab00000000000000000000000000000000000000000000000000000000000000">
EXEC @RETURN_VALUE = [dbo].[uspBatch_Update] @RequestId = @p0, @BatchId = @p1, @BatchStatusId = @p2, @ReportBlobId = @p3, @CompletedDate = @p4, @ErrorCode = @p5, @ImportReportVersion = @p6, @ExportReportVersion = @p7    </frame>
                <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
            </executionStack>
            <inputbuf>
(@p0 uniqueidentifier,@p1 int,@p2 int,@p3 varchar(8000),@p4 datetime,@p5 int,@p6 int,@p7 int,@RETURN_VALUE int output)EXEC @RETURN_VALUE = [dbo].[uspBatch_Update] @RequestId = @p0, @BatchId = @p1, @BatchStatusId = @p2, @ReportBlobId = @p3, @CompletedDate = @p4, @ErrorCode = @p5, @ImportReportVersion = @p6, @ExportReportVersion = @p7   </inputbuf>
        </process>
    </process-list>
    <resource-list>
        <pagelock fileid="13" pageid="52372905" dbid="11" subresource="FULL" objectname="database1.dbo.Batch" id="lock9f21680580" mode="IX" associatedObjectId="72060857777979392" databaseName="database1">
            <owner-list>
                <owner id="process2e950984e8" mode="IX" />
            </owner-list>
            <waiter-list>
                <waiter id="process11634c19088" mode="S" requestType="wait" />
            </waiter-list>
        </pagelock>
        <pagelock fileid="13" pageid="14044552" dbid="11" subresource="FULL" objectname="database1.dbo.Batch" id="lock1506883db00" mode="S" associatedObjectId="72060857777979392" databaseName="database1">
            <owner-list>
                <owner id="process11634c19088" mode="S" />
            </owner-list>
            <waiter-list>
                <waiter id="process2e950984e8" mode="IX" requestType="wait" />
            </waiter-list>
        </pagelock>
    </resource-list>
</deadlock>
sql-server sql-server-2014
  • 1 个回答
  • 417 Views
Martin Hope
jesijesi
Asked: 2018-10-08 23:39:21 +0800 CST

清理 MSrepl_errors,SQL Server 复制

  • 2

我们的 MSrepl_errors 表大约有 15GB,并且从一开始就有记录。清理这张桌子的正确方法是什么。我们只是从中删除吗?

编辑 分发代理清理已在运行。 在此处输入图像描述

干杯

sql-server sql-server-2014
  • 1 个回答
  • 757 Views
Martin Hope
jesijesi
Asked: 2018-08-03 04:21:29 +0800 CST

即使存在覆盖索引,也对分区表进行聚簇索引扫描

  • 3

我有一个基于 col1 int 分区的分区表。我还有一个覆盖索引,用于我正在尝试排除故障的查询。

https://www.brentozar.com/pastetheplan/?id=BkNrNdgHm

以上是方案

随心所欲,SQL Server 决定对整个表进行聚簇索引扫描,这显然很慢。如果我强制使用索引(如上面的计划),查询将快速运行。

SQL Server用什么神奇的逻辑来决定覆盖索引没有用?我不确定 top/orderby 和 rowgoal 是否与它有任何关系。

我的表结构是

Create table object2(col1 int, col3 datetime, col4 int, col5, col6 etc) clusterd on col1

nonclustered non aligned index is on col3,col4 (col1 is clustered so its included in nonclust)

SELECT top(?) Object1.Column1
    FROM Object2 Object1 WITH (NOLOCK,index(Column2))
    WHERE  Object1.Column3 >= ?
    AND Object1.Column4 IN (?)
    ORDER BY Object1.Column1

编辑添加的回购

    CREATE PARTITION FUNCTION [PFtest](int) AS RANGE RIGHT FOR VALUES (100000, 200000, 300000, 400000, 500000, 600000, 700000, 800000, 900000, 1000000)
    GO
    CREATE PARTITION SCHEME [PStest] AS PARTITION [PFtest] all TO ([PRIMARY]);
    GO

    create table test([ID] [int] IDENTITY(1,1) NOT NULL primary key clustered,[Created] [datetime] NULL,[Type] [int] NULL,text1 varchar(10),text2 varchar(20))
    on pstest(id)
    set nocount on

    declare @a int =1
    declare @type int
    while 1=1
    begin
    if @a%30 =0
    insert into test (Created, Type, text1, text2) select getdate(),4,'four','four'
    else
    insert into test (Created, Type, text1, text2) select getdate(),1,'one','one'
    set @a=@a+1
    end
    create nonclustered index ncl1 on test(created, type)

select min(created),max(created) from test
--2018-08-02 22:46:40.187   2018-08-02 22:49:01.577
SELECT top(10) ID
    FROM test  
    WHERE  Created >= '2018-08-02 22:49:01'
    AND Type IN (1, 4)
    ORDER BY ID -- clustered index scan

SELECT top(10) ID
    FROM test  
    WHERE  Created >= '2018-08-02 22:49:01.577'
    AND Type IN (1, 4)
    ORDER BY ID-- index seek of ncl1
sql-server sql-server-2014
  • 2 个回答
  • 820 Views
Martin Hope
jesijesi
Asked: 2018-01-02 20:58:23 +0800 CST

对称密钥创建问题

  • 1

我正在浏览CREATE SYMMETRIC KEY (Transact-SQL)页面。

在那里它说作为一个警告

当使用密码而不是数据库主密钥的公钥对对称密钥进行加密时,将使用 TRIPLE DES 加密算法。因此,使用 AES 等强加密算法创建的密钥本身由较弱的算法保护。

我不明白粗体的第一部分,有几个问题。

  1. 根据我的测试,我没有看到使用数据库主密钥加密对称密钥的选项。

  2. 数据库主密钥不是对称密钥吗?数据库主密钥的公钥是什么意思?

sql-server sql-server-2014
  • 1 个回答
  • 81 Views
Martin Hope
jesijesi
Asked: 2017-09-06 18:02:27 +0800 CST

选择并插入链接服务器

  • 5

我无法理解链接服务器的情况。

所以我们有一个从 2008R2 服务器到 2014 服务器的链接服务器。下面的示例查询是从 2008R2 服务器执行的,它工作正常。

SET XACT_ABORT ON;
 Declare @BatchSize int = 10
      DELETE from LINKEDSRV.DB.DBO.Table
      INSERT INTO LINKEDSRV.DB.DBO.Table (ECN)
      SELECT TOP (10) C1 from LINKEDSRV.DB.DBO.Table22 --order by C1
      SELECT * FROM LINKEDSRV.DB.DBO.Table

但是当我用它执行相同的事情时,order by C1它不会返回任何结果。

第二种情况 - 如果我替换TOP(10)withTOP(@BatchSize)并且 noorder by我也没有得到任何结果。例如

SELECT TOP (@BatchSize) C1 from LINKEDSRV.DB.DBO.Table22 

如果我SET XACT_ABORT OFF. 那么 XACT_ABORT 在链接服务器方面是否有任何限制?

编辑- 做了更多的测试,看起来它也与行数有关

可能的回购

在服务器 A 上

use testdb
go
create table t1( c1 int, c2 datetime)
create table t2( c1 int, c2 datetime)

insert into t2 select 1, GETDATE()
insert into t2 select  * from t2 -- insert close to 5000 rows, I found the issue around over around 35000 rows

在服务器 B

创建到 ServerA 的链接服务器

SET XACT_ABORT ON;
Declare @BatchSize int = 10
delete from ServerA.testdb.dbo.t1
insert into ServerA.testdb.dbo.t1 (c1) 
select top (@BatchSize) c1 from ServerA.testdb.dbo.t2 --order by c2
select * from ServerA.testdb.dbo.t1

没有输出。但是,如果您将表 t2 中的行数减少到 2000 左右,它就可以正常工作。

sql-server sql-server-2008-r2
  • 2 个回答
  • 13005 Views
Martin Hope
jesijesi
Asked: 2017-08-02 16:34:35 +0800 CST

如何在 SQL Server 中禁用只读路由

  • 2

我知道我可以更改连接字符串以删除该applicationintent属性,但是如何从 SQL Server 中删除配置?

例如,如果我们查询sys.availability_read_only_routing_lists,我如何得到一个空的结果?

sql-server sql-server-2014
  • 2 个回答
  • 2057 Views
Martin Hope
jesijesi
Asked: 2017-06-11 20:30:24 +0800 CST

了解更新期间的非聚集索引锁定

  • 4

安装脚本

CREATE TABLE t2 (   [col1] INT, [col2] INT  );

DECLARE @int INT;
SET @int = 1;

WHILE (@int <= 1000) 
BEGIN
    INSERT INTO t2 
        ([col1], [col2])
    VALUES (@int*2, @int*2);
    SET @int = @int + 1;
END
GO
create clustered index cl on t2(col1)
create  index ncl on t2(col2)

我运行了一个简单的更新并保持事务在读取提交隔离级别打开。

begin tran
update t2 set [col2]=[col2]+1  where col1=6

如果我在另一个会话中检查 sp_lock,我会得到以下结果

在此处输入图像描述

我想了解的是非聚集索引(indid 2)上的键锁。为什么非聚集索引上有两个键锁?

如果我检查页面 id 248 上的 dbcc 页面,我可以找到明显的一个((1bfceb831cd9)),它是记录 6 的条目的锁,记录 6 已更改为 7。下面 DBCC PAGE 的输出

在此处输入图像描述

我想了解的是另一个钥匙锁 (5ebca7ef4e2c) 的用途是什么以及它的锁定是什么。

sql-server sql-server-2014
  • 1 个回答
  • 1303 Views
Martin Hope
jesijesi
Asked: 2017-05-01 17:12:35 +0800 CST

无法截断事务日志,log_reuse_wait_desc - AVAILABILITY_REPLICA

  • 10

今天早上,我被我们的一个数据库上的事务日志完整警报唤醒。该服务器是一个永远在线的集群,也是一个事务复制订阅者。我检查了 log_reuse_wait_desc,它显示了 logbackup。4 天前有人不小心禁用了日志备份作业,我重新启用了日志备份作业并且日志被清除了。由于现在是凌晨 4 点,我想我会在那天早上晚些时候去办公室并缩小日志,因为它已经增长到 400GB。

上午 10 点——我在办公室,我在缩小之前检查了日志使用情况,大约是 16%。我很惊讶并检查了显示复制的 log_reuse_wait_desc。我很困惑,因为这是一个复制订户。然后我们看到为 CDC 启用了 db,并认为这可能是原因,因此禁用了 CDC,现在 log_reuse_wait_desc 显示 AVAILABILITY_REPLICA。

同时,日志使用量仍在稳步增长,目前为 17%。我检查了alwayson仪表板并检查了已发送和重做队列,两者几乎为零。我不确定为什么日志重用显示为 AVAILABILITY_REPLICA 并且无法清除日志。

知道为什么会这样吗?

sql-server sql-server-2014
  • 4 个回答
  • 11502 Views
Martin Hope
jesijesi
Asked: 2017-02-07 14:43:27 +0800 CST

流聚合排序?

  • 5

在此处输入图像描述

试图理解上面查询计划中的一些事情。

  • 当我没有分组依据时,为什么查询中会有一个流聚合。我猜这与正在合并的连接及其进行某种排序有关吗?

  • 其次,更重要的是,为什么 13
    进入流的估计总计结果为 24,595,900?这导致了 Object4 扫描聚集索引而不是嵌套循环的第二个问题。我不得不将查询拆分为两个查询而不是使用 OR,并且连接变成嵌套循环并查找 Object4。

查询计划

https://www.brentozar.com/pastetheplan/?id=BJk2eFLul

sql-server sql-server-2008-r2
  • 1 个回答
  • 1036 Views
Martin Hope
jesijesi
Asked: 2017-02-01 00:00:09 +0800 CST

变量嗅探?

  • 5

这可能很愚蠢,感觉就像我要回去尝试理解基础知识一样。

所以我创建了一个如下所示的测试表并在其上创建了一个聚簇索引

create table test( c1 int)

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
SET @Lower = 1 
SET @Upper = 10000 
while 1=1
begin
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
insert into test SELECT @Random
end 

create clustered index cidx on test(c1)

现在我运行下面的查询和实际的执行计划

DECLARE @Min INT

SET @Min = 216 --selected this cause this was a histogram step

select * from test  where c1 = @Min
select * from test  where c1 = @Min option(recompile)

因此,对于第一个查询,行为符合预期,估计的行数是根据密度向量计算的。

搜索谓词 - 搜索键1:前缀:[db].[dbo].[test].c1 = 标量运算符([@Min])

在此处输入图像描述

但是对于第二个查询,sql server 似乎可以使用选项(重新编译)嗅探值。我认为即使我们使用选项重新编译,SQL Server 也无法嗅探变量?

查找谓词 - 查找键1:前缀:[DB].[dbo].[test].c1 = Scalar Operator( (216) )

在此处输入图像描述

因此,正如您从估计的行数中看到的那样,第一个是 3.2511,它来自密度向量,第二个是 7 的估计行数来自直方图。

那么,当我们重新编译即席查询时,SQL Server 真的可以嗅探变量吗?还是我不明白?

sql-server sql-server-2014
  • 1 个回答
  • 220 Views
Martin Hope
jesijesi
Asked: 2017-01-19 15:10:54 +0800 CST

将文章添加到事务复制中,根本不生成快照

  • 0

我有一个事务复制,订阅是从多年前的快照同步的。现在我有一个新表需要添加到复制中。问题是该表接近 TB,我不想为该表生成快照,而只想同步新数据,有点像从备份同步时。它只插入到表中,我可以稍后手动同步旧数据。

如何进行复制以在不生成快照的情况下开始传输数据。

sql-server sql-server-2014
  • 4 个回答
  • 1362 Views
Martin Hope
jesijesi
Asked: 2016-12-05 21:35:05 +0800 CST

SQL Server 复制错误“配置文件名称无效”

  • 1

今天,我开始在其中一个分发代理上收到以下错误消息。该出版物具有一键式和一键式订阅。该错误仅出现在推送订阅中。发布服务器有 5 个其他发布,每个发布都具有对相同服务器的拉取和推送订阅,并且它们都工作正常。

我尝试更改分销商代理配置文件并重新启动分销工作,但没有奏效。

Message
2016-12-05 00:41:45.429 Copyright (c) 2014 Microsoft Corporation
2016-12-05 00:41:45.429 Microsoft SQL Server Replication Agent: distrib
2016-12-05 00:41:45.429 
2016-12-05 00:41:45.429 The timestamps prepended to the output lines are expressed in terms of UTC time.
2016-12-05 00:41:45.429 User-specified agent parameter values:
            -Subscriber SubscriberServer
            -SubscriberDB DBName
            -Publisher Publisher1
            -Distributor DistributerServer
            -DistributorSecurityMode 1
            -Publication DBName_HA_Pub
            -PublisherDB DBName
            -Continuous
            -XJOBID 0x0D2A9EB2B6FBDF4CAE11F0A700401787
            -XJOBNAME Publisher_instance_-DBName-DBName_HA_Pub-SubscriberServer-48
            -XSTEPID 2
            -XSUBSYSTEM Distribution
            -XSERVER DistributerServer
            -XCMDLINE 0
            -XCancelEventHandle 0000000000006888
            -XParentProcessHandle 00000000000083E8
2016-12-05 00:41:45.429 Startup Delay: 668 (msecs)
2016-12-05 00:41:46.101 Connecting to Distributor 'DistributerServer'
2016-12-05 00:41:46.179 Parameter values obtained from agent profile:
            -bcpbatchsize 2147473647
            -commitbatchsize 100
            -commitbatchthreshold 1000
            -historyverboselevel 2
            -keepalivemessageinterval 300
            -logintimeout 15
            -maxbcpthreads 1
            -maxdeliveredtransactions 0
            -pollinginterval 5000
            -querytimeout 1800
            -skiperrors 
            -transactionsperhistory 100
2016-12-05 00:41:46.179 Connecting to Subscriber 'SubscriberServer'
2016-12-05 00:41:46.226 Initializing
2016-12-05 00:41:46.288 
42000 profile name is not valid 14607
2016-12-05 00:41:46.288 
42000 profile name is not valid 14607
2016-12-05 00:41:46.288 
42000 profile name is not valid 14607
2016-12-05 00:41:46.304 Disconnecting from Subscriber 'SubscriberServer'
2016-12-05 00:41:46.304 Connecting to Subscriber 'SubscriberServer'
2016-12-05 00:41:46.304 Error executing a batch of commands. Retrying individual commands.
2016-12-05 00:41:51.351 Disconnecting from Subscriber 'SubscriberServer'
2016-12-05 00:41:51.351 Connecting to Subscriber 'SubscriberServer'
2016-12-05 00:41:51.367 Error executing a batch of commands. Retrying individual commands.
2016-12-05 00:42:01.390 Disconnecting from Subscriber 'SubscriberServer'
2016-12-05 00:42:01.390 Connecting to Subscriber 'SubscriberServer'
2016-12-05 00:42:01.406 Error executing a batch of commands. Retrying individual commands.
2016-12-05 00:42:16.423 Disconnecting from Subscriber 'SubscriberServer'
2016-12-05 00:42:16.423 Connecting to Subscriber 'SubscriberServer'
2016-12-05 00:42:16.454 Error executing a batch of commands. Retrying individual commands.
2016-12-05 00:42:36.474 Disconnecting from Subscriber 'SubscriberServer'
2016-12-05 00:42:36.474 Connecting to Subscriber 'SubscriberServer'
2016-12-05 00:42:36.505 Error executing a batch of commands. Retrying individual commands.
2016-12-05 00:43:01.524 Disconnecting from Subscriber 'SubscriberServer'
2016-12-05 00:43:01.524 Connecting to Subscriber 'SubscriberServer'
2016-12-05 00:43:01.540 Error executing a batch of commands. Retrying individual commands.
2016-12-05 00:43:01.556 Agent message code 14607. profile name is not valid
2016-12-05 00:43:01.571 Category:COMMAND
Source:  Failed Command
Number:  
Message: if @@trancount > 0 rollback tran
2016-12-05 00:43:01.571 Category:NULL
Source:  Microsoft SQL Server Native DBName 11.0
Number:  14607
Message: profile name is not valid
sql-server transactional-replication
  • 1 个回答
  • 1479 Views
Martin Hope
jesijesi
Asked: 2016-11-21 17:05:59 +0800 CST

SQL Server 服务账户从虚拟账户更改为 AD 账户

  • 2

当您将 SQL Server 服务帐户从虚拟帐户 (NT SERVICE\MSSQLSERVER) 更改为 Windows AD 帐户时,有关于如何授予本地权限(如作为服务登录和替换进程级令牌)的问题。

我第一次安装 sql server 时没有指定 windows 帐户。安装后,当我检查“本地安全策略”时,我可以看到“NT SERVICE\MSSQLSERVER”已添加到“作为服务登录”和“替换进程级令牌”等权限中。

然后我使用配置管理器将服务帐户更改为 Windows AD 帐户,然后返回并再次检查本地安全策略,但我找不到在其中任何一个中添加的新 Windows AD 帐户。

所以我想知道 Windows AD 帐户如何获得这些权限?它是否以某种方式链接到虚拟帐户?

SQL Server 2014, Windows 2012R2

我已经完成了以下问题,但未涵盖此特定问题。

SQL Server 服务帐户 Windows 特权和权限

sql-server sql-server-2014
  • 2 个回答
  • 1278 Views
Martin Hope
jesijesi
Asked: 2016-10-16 21:33:40 +0800 CST

FCI 与 Alwayson 可用性组(非对称存储)

  • 1

我正在尝试设置一个演示环境,其中我有一个带有 3 个节点的 Windows 集群。
节点 1 将是独立的 sql server,并将成为主要副本。节点 2 和 3 将位于故障转移群集实例 (sqlclu1) ​​中,这将是异步辅助副本。

我已经将 sql server 安装为集群实例(节点 2 和 3),并且有一个共享存储(E: 驱动器),它仅提供给节点 2 和 3,并且包含 sql 数据文件(我的意思是,可能的所有者该磁盘仅是节点 2 和 3,而且我还没有将磁盘连接到节点 1)。

我被困在下一步,我试图在节点 1 上安装一个独立的 sql server 作为主副本。问题是当我尝试添加具有相同名称 (E:) 的磁盘时,它不允许我这样做。当我创建新卷时,E:drive 在列表中不可用。

我猜我已经塞满了东西并且想知道如何配置非对称存储以便我可以创建具有相同驱动器号的磁盘。

根据https://msdn.microsoft.com/en-us/library/jj215886.aspx

非对称存储 两个 FCI,一个位于单个多站点 WSFC 上的每个站点,介绍了有关如何处理共享存储的注意事项。每个 FCI 都有自己的共享存储。主站点节点之间共享存储,形成一个共享存储FCI,容灾站点节点之间共享存储,形成另一个共享存储FCI。主站点上的存储对灾难恢复站点上的节点不可见,反之亦然。这种存储安排(其中集群磁盘在 WSFC 内的节点子集之间共享)称为非对称存储。在非对称存储能力出现之前,共享存储需要对 WSFC(对称存储)中的所有节点可见。此 Windows Server 增强功能是启用本白皮书中讨论的 FCI + AG 解决方案架构的关键功能。通过启用此功能,您可以将共享存储解决方案 (FCI) 与非共享存储解决方案(可用性组)结合在一个 HA + DR 解决方案中。因此,此增强功能还使您能够为跨数据中心的共享磁盘资源使用相同的驱动器号。

使用sql server 2014和windows 2012R2

sql-server sql-server-2014
  • 2 个回答
  • 784 Views
Martin Hope
jesijesi
Asked: 2016-09-02 01:18:07 +0800 CST

步内统计值 >= 和 > 的基数估计

  • 13

我试图了解 SQL Server 如何尝试估计 SQL Server 2014 中的“大于”和“大于等于”where 子句。

我想我确实理解了基数估计,例如,如果我这样做的话

    select * from charge where charge_dt >= '1999-10-13 10:47:38.550'

基数估计为 6672,可以很容易地计算为 32(EQ_ROWS) + 6624(RANGE_ROWS) + 16 (EQ_ROWS) = 6672(下面屏幕截图中的直方图)

在此处输入图像描述

但是当我这样做的时候

    select * from charge where charge_dt >= '1999-10-13 10:48:38.550' 

(将时间增加到 10:48,所以它不是一个步骤)

估计是4844.13。

这是怎么计算的?

sql-server sql-server-2014
  • 2 个回答
  • 685 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve