我正在测试 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
我为实现这个目标做了什么:
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 导出到 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) 我正在通过 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) 我已经阅读了很长时间,当数据库启用了 TDE 时,压缩备份似乎并不安全。
是否有人在使用 tde 数据库的压缩备份还原期间遇到错误?
我从未经历过此类错误,但我真的很担心。
似乎问题出在 SQL SERVER 2016 上,因为我使用的是 2012,所以我看不到任何问题。
此外,即使使用MAXTRANSFERSIZE = 131072备份也不压缩。会是什么呢?我正在使用NO CHECKSUM和WITH CHECKSUM两者的尺寸相同。
backup compression sql-server-2012 transparent-data-encryption
编辑:
我知道这个问题已经结束,但我希望它会对某人有所帮助。
问题出在我们的磁盘( 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) 我有一个查询,即使使用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
我在一些过程和查询中尽我所能来调整一些过程。所以我使用调优顾问来查看我是否遗漏了什么,令我惊讶的是,有很多统计数据需要创建(创建统计数据...)。
但是我的数据库设置为自动创建和更新统计信息。为什么调整顾问会创建?为什么 sql server 在执行这些查询/过程期间没有创建它们?
我今天正在考虑类似的事情,但找不到这条信息。
当 SQL Server 请求内存而操作系统无法提供内存时,我们会得到RESOURCE_SEMAPHORE等待类型。
但我找不到类似的信息:
假设查询要求 3GB。但只能提供2,查询是否仍然运行缓慢,或者一直在那里等待?
RESOURCE_SEMAPHORE意味着查询处于“停止”状态只是等待内存?
待处理的内存授予应该始终为 0,对吗?这意味着查询正在请求多少内存但仍在等待,对吧?
我正在阅读Microsoft 的《内存授予:神秘的 SQL Server 内存消费者与许多名字》,但它没有解释这一点,它只是解释了什么是内存授予。
我的查询运行有点慢,我认为这是因为该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。
我们处于这样的情况:选择被更新阻止。但表格不同。
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 ×8
performance ×2
backup ×1
bcp ×1
compression ×1
excel ×1
export ×1
locking ×1
memory ×1
memory-grant ×1
optimization ×1