小编Rac*_*SQL的帖子

强制Sql server在合并连接中使用索引查找

我正在测试 sql server 中的合并加入。我有一个INNER JOIN并强制优化器执行以下操作MERGE JOIN

  • ID 在个人表中是主键
  • ID 在 Abteilung 表是主键
  • 这些表中没有其他索引

     select * from  [dbo].[Personal] as P inner join [dbo].[Abteilung] as A  
     on  P.[ID]= A.[Personal_ID]   OPTION (MERGE JOIN) 
    
    Run Code Online (Sandbox Code Playgroud)

然后优化器使用这个计划来运行我的查询:

在此处输入图片说明

我想强制优化器使用index seek而不是Table Scan

我为实现这个目标做了什么:

  • 在 Table Abteilung 中的列ID,上定义分组索引Personal_ID。如果我运行查询,执行计划是这样的变化:

在此处输入图片说明

这里我有聚集索引扫描,但没有聚集索引搜索

  • 使用FORCESEEK提示。如果我使用此提示,运行查询会发生错误:

由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询。

  • 如果我在查询中添加 where 子句,则查询将更改为:

      select * from  [dbo].[Personal] as P inner join [dbo].[Abteilung] as A  
      on P.[ID]= A.[Personal_ID] where A.[Personal_ID]=2 
      OPTION (MERGE    JOIN) …
    Run Code Online (Sandbox Code Playgroud)

sql-server optimization execution-plan sql-server-2012

2
推荐指数
1
解决办法
5421
查看次数

创建每月作业以从 SQL Server 2014 导出到 Excel

这里有很多问题询问“如何从 SQL Server 导出到 Excel”,但是每个答案以及我知道的东西都给我带来了问题(这里是 64 位系统)。

我们有一个开发人员每月运行 6 次查询(从 2010 年、2011 年等更改年份)。然后,他将结果复制并粘贴到 Excel 电子表格中。

我在将这些数据从 SQL Server 2014 导出到 Excel 时遇到问题。

这是查询:

SELECT 
R.numero,
R.ano,
R.data 'data abertura',
R.datahora_conclusao  'data conclusão',
R.datahora_emissao 'data emissão',
S.[status],
(ins.INSTITUTO +
            ' - ' + dir.DIRETORIA + 
            (CASE WHEN NOT nuc.NUCLEO IS NULL THEN  ' - ' + nuc.NUCLEO  ELSE '' END) +
            (CASE WHEN NOT equ.EQUIPE IS NULL THEN ' - ' + equ.EQUIPE ELSE '' END)) AS UNIDADE,
N.codigo 'codigo natureza …
Run Code Online (Sandbox Code Playgroud)

sql-server export excel sql-server-2014

2
推荐指数
1
解决办法
6491
查看次数

为什么 BCP 会创建这么大的文件?

我正在通过 BCP 创建一些报告以通过电子邮件发送。

create TABLE ##tempsss
    (
        create TABLE ##JOB_DataAssociacao_verContrato
(
     F1        VARCHAR(6)  
    ,F2        VARCHAR(200)  
    ,F3        VARCHAR(22)  
    ,F4        char(1)    
    ,F5         varchar(10) 
    ,F6         varchar(15)
    ,F7         varchar(30)  
    ,F8          varchar(10)      
    ,F9          VARCHAR(18)  
)  --it needs to be varchar to be able to use header
    )
    
insert into  ##tempsss
SELECT 
...fields...     
FROM some table or view
go
-------------------------------------------------------------
--passo 2 --

exec xp_cmdshell 'bcp "select ''field1'',''field2'',''field3'' UNION ALL select * from table or view" queryout "filepath\filename.xls" -U sa -P password -w  -S servername'
------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

sql-server bcp sql-server-2012

2
推荐指数
1
解决办法
224
查看次数

在启用 TDE 的情况下压缩数据库备份是否安全?

我已经阅读了很长时间,当数据库启用了 TDE 时,压缩备份似乎并不安全。

是否有人在使用 tde 数据库的压缩备份还原期间遇到错误?

我从未经历过此类错误,但我真的很担心。

似乎问题出在 SQL SERVER 2016 上,因为我使用的是 2012,所以我看不到任何问题。

此外,即使使用MAXTRANSFERSIZE = 131072备份也不压缩。会是什么呢?我正在使用NO CHECKSUMWITH CHECKSUM两者的尺寸相同。

backup compression sql-server-2012 transparent-data-encryption

2
推荐指数
1
解决办法
483
查看次数

高 PAGEIOLATCH_SH 在服务器上等待

编辑:

我知道这个问题已经结束,但我希望它会对某人有所帮助。

问题出在我们的磁盘( cluster )上。

使用 PerfMon,我可以创建一些计数器(磁盘读取和写入)并且读取计数器固定为 100%。

高读取我看到以下等待sp_WhoIsActive



PAGEIOLATCH_SH:Database_Name:1(*)
Run Code Online (Sandbox Code Playgroud)

我在这里看到一些帖子,说这个警告是因为高 I/O。SQL Server 联机丛书将 SQL 等待类型 PAGEIOLATCH_SH 定义为:

当任务正在等待 I/O 请求中的缓冲区的闩锁时发生。锁存请求处于共享模式。

和这个:

用户进程将请求一些当前不在缓冲区缓存中的数据。此时——SQL Server 将尝试分配一个缓冲区页——当数据从磁盘移动到缓冲区缓存时,在缓冲区上创建了一个独占的 PAGEIOLATCH_EX。同时从用户进程的角度在缓冲区上创建一个 PAGEIOLATCH_SH。

我创建了索引和统计信息,还使用了 SQL Server Profiler 来帮助我。

有什么办法可以改进查询吗?我怎样才能改进大量的处理ANDs

我们已经遇到这个问题大约一个星期了,我不知道该怎么办。

SELECT TOP 30 codCliente 
FROM (
    SELECT t1.CodCliente
        , codcampo
        , valor
        , t1.chavealeat 
    FROM tblCliente AS t1 WITH(NOLOCK) 
        INNER JOIN tblClienteDetalhe AS t2 WITH (NOLOCK) 
            ON t1.codcliente = t2.codcliente 
            AND CodCampo IN (-1, 4)
    WHERE codStatus IN(0)  
        AND t1.ChavePeriodo < getdate() …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2008 sql-server query-performance

1
推荐指数
1
解决办法
7292
查看次数

无法消除索引扫描

我有一个查询,即使使用SQL Sentry,也无法消除索引扫描。

这是查询:

SELECT TOP 30 codCliente FROM (
        SELECT t1.CodCliente, codcampo, valor, t1.chavealeat 
        FROM tblCliente AS t1 WITH(NOLOCK) 
            INNER JOIN tblClienteDetalhe AS t2 WITH(NOLOCK) 
            ON t1.codcliente = t2.codcliente 
            AND CodCampo IN(-1, 4)
        WHERE codStatus IN (0)  
            AND t1.ChavePeriodo < GETDATE()
            AND t1.CodStatusLigacao = 0
            AND EXISTS
            (
                SELECT codcliente FROM tblclientedetalhe WITH(NOLOCK) 
                WHERE codcampo = 3 AND valor = '2' 
                    AND codcliente = t1.codcliente
            )
            AND EXISTS
            (
                SELECT codcliente FROM tblclientedetalhe WITH(NOLOCK) 
                WHERE codcampo = 6
                    AND CONVERT(DATETIME, …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2008 sql-server clustered-index query-performance

1
推荐指数
1
解决办法
81
查看次数

为什么我的数据库引擎优化顾问试图创建统计信息,即使我正在使用“自动创建/更新统计信息”

我在一些过程和查询中尽我所能来调整一些过程。所以我使用调优顾问来查看我是否遗漏了什么,令我惊讶的是,有很多统计数据需要创建(创建统计数据...)。

但是我的数据库设置为自动创建和更新统计信息。为什么调整顾问会创建?为什么 sql server 在执行这些查询/过程期间没有创建它们?

sql-server-2008-r2

1
推荐指数
1
解决办法
378
查看次数

即使 SQL Server 无法为查询授予请求的内存,查询是否仍然运行?

我今天正在考虑类似的事情,但找不到这条信息。

当 SQL Server 请求内存而操作系统无法提供内存时,我们会得到RESOURCE_SEMAPHORE等待类型。

但我找不到类似的信息:

  1. 假设查询要求 3GB。但只能提供2,查询是否仍然运行缓慢,或者一直在那里等待?

  2. RESOURCE_SEMAPHORE意味着查询处于“停止”状态只是等待内存?

  3. 待处理的内存授予应该始终为 0,对吗?这意味着查询正在请求多少内存但仍在等待,对吧?

我正在阅读Microsoft 的《内存授予:神秘的 SQL Server 内存消费者与许多名字》,但它没有解释这一点,它只是解释了什么是内存授予。

sql-server memory memory-grant

1
推荐指数
1
解决办法
329
查看次数

调整 WHERE datediff

我的查询运行有点慢,我认为这是因为该where datediff函数。

WHERE DateDiff(minute, TB1.stDate, getdate()) > 50
Run Code Online (Sandbox Code Playgroud)

(通过这种方法至少使用我创建的索引)

之前是这样的:

datediff(minute, TB1.stDate), '2017-01-01') <= 0)
Run Code Online (Sandbox Code Playgroud)

我想了解是否有更好的方法使用 datediff 进行过滤。

我的问题是,即使在函数内部,我的查询如何已经使用索引DATEDIFF

sql-server sql-server-2016

0
推荐指数
1
解决办法
534
查看次数

表 X 上的更新如何锁定表 Y?

我们处于这样的情况:选择被更新阻止。但表格不同。

UPDATE [dbo].[TABLE_1]
SET ...

SELECT [t1].[field]
FROM [dbo].[TABLE_1] AS [t1]
WHERE...
Run Code Online (Sandbox Code Playgroud)

当它们同时运行时,这个简单的过程会阻塞这个过程:

SELECT "A lot of fields"
FROM TABLE_TOTALLY_DIFFERENT
INNER JOIN [another table totally different] 
ON...
WHERE...
Run Code Online (Sandbox Code Playgroud)

这对我来说毫无意义。

即使通过查看 pageID,我也可以看到在这种情况下被锁定的表是TABLE_TOTALLY_DIFFERENT.

但他们与他们无关。

我如何查找并确定它们被锁定的原因?

sql-server sql-server-2012 locking

0
推荐指数
1
解决办法
74
查看次数