AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-92809

user1716729's questions

Martin Hope
user1716729
Asked: 2020-08-18 11:09:36 +0800 CST

Alta espera de WRITELOG no Banco de Dados SQL do Azure

  • 1

Minha análise de WaitStats do nosso Banco de Dados SQL do Azure está mostrando WRITELOG e HADR_SYNC_COMMIT como contador de espera mais alta. Este é um recurso Premium 250 eDTU.

Roteiro

SELECT   TOP (10) wait_type,
                  CAST (([wait_time_ms] / 1000.0) AS DECIMAL (16, 2)) AS [WaitS],
                  CAST (100.0 * [wait_time_ms] / SUM([wait_time_ms]) OVER () AS DECIMAL (16, 2)) AS [Percentage]
FROM     sys.dm_db_wait_stats
ORDER BY [Percentage] DESC;

insira a descrição da imagem aqui

Não consigo encontrar muitas informações sobre como resolver isso no banco de dados SQL do AZure.

Qualquer ajuda é apreciada.

Obrigado

sql-server azure-sql-database
  • 1 respostas
  • 370 Views
Martin Hope
user1716729
Asked: 2020-05-01 08:45:08 +0800 CST

Inserção de tabela de pilha

  • 4

Estou tentando entender o comportamento do SQL Server quando ele INSERT registro em uma tabela Heap. De acordo com a postagem do blog sobre o sql Server , o parágrafo 2 " O SQL Server não colocaria uma nova linha na página se seu tamanho exceder 20% (8.060 bytes * 0,2 = 1.612 bytes) do tamanho da página " .

Se eu entendi a declaração corretamente, se a tabela tivesse um registro de tamanho 2025 bytes, o segundo registro deveria ir para outra página. No entanto, meu teste não está concordando com isso

SCRIPT DE CONFIGURAÇÃO

Ambiente : SQL 2019 x64 Developer Edition.

create table dbo.Heap(id INT, Val varchar(8000) not null);
GO
insert into dbo.heap(ID, val)  values (1,replicate('*',2010));
insert into dbo.heap(ID, val)  values (2,replicate('*',2010));
insert into dbo.heap(ID, val)  values (3,REPLICATE('*',2010));
insert into dbo.heap(ID, val)  values (4,REPLICATE('*',2010));

E execute o seguinte código

SELECT PARSENAME(REPLACE(REPLACE(REPLACE(CAST(sys.fn_PhysLocFormatter (%%physloc%%) AS varchar),')',''),'(',''),':','.'),2)PageNo,
sys.fn_PhysLocFormatter (%%physloc%%) AS [Location],* FROM heap ORDER BY [ID]

O SELECT acima retorna o seguinte resultado, que não concorda com a declaração de tamanho de página de 20%.

insira a descrição da imagem aqui

Tentei revisar o resultado da DBCC PAGE após a inserção, mas o resultado da DBCC PAGE não soma o tamanho do registro inserido.

Script de CONFIGURAÇÃO

DROP TABLE IF EXISTS heap
go
create table dbo.Heap(id INT, Val varchar(8000) not null);
GO
insert into dbo.heap(ID, val)  values (1,replicate('*',2010));
go
dbcc traceon(3604);
dbcc page
(
    'demodb' -- Database name
    ,1 -- File ID
    ,416 -- Page ID
    ,1 -- Output mode: 3 - display page header and row details
);

O tamanho dos registros era de apenas 25% da página de dados, no entanto, o PFS mostra 50% completo, por quê? insira a descrição da imagem aqui Emita a segunda inserção e revise a PÁGINA

insert into dbo.heap(ID, val)  values (2,replicate('*',2010));
dbcc page
(
    'demodb' -- Database name
    ,1 -- File ID
    ,416 -- Page ID
    ,1 -- Output mode: 3 - display page header and row details
);

insira a descrição da imagem aqui

sql-server sql-server-2019
  • 1 respostas
  • 146 Views
Martin Hope
user1716729
Asked: 2020-04-30 10:15:19 +0800 CST

Acesso a dados de índice clusterizado

  • 3

Estou tentando entender como o SQL Server acessa dados do índice clusterizado. Meu entendimento é que quando a tabela tem um índice clusterizado, o SQL deve ser capaz de buscar na única página que contém o registro usando o predicado de busca.

No entanto, meu teste me mostrando quando a consulta é executada, carrega mais algumas páginas de dados.

Configurar

CREATE TABLE t2(id INT IDENTITY PRIMARY KEY CLUSTERED,col2 VARCHAR(500),col3 VARCHAR(500));

INSERT INTO [dbo].[t2]([col2],[col3])
SELECT TOP 10010 REPLICATE('z',490),REPLICATE('*',490)
FROM sys.all_columns c1,
     sys.all_columns c2

A seguinte consulta

select *
from sys.dm_db_index_physical_stats(db_id(),object_id(N'dbo.t2'),DEFAULT,null,'DETAILED');

mostra a saída como

insira a descrição da imagem aqui

Eu então limpei o cache com

CHECKPOINT 

GO

DBCC DROPCLEANBUFFERS

E correu a seguinte SELECTbusca em uma única linha

SELECT  [fplc].*,[t2].[col3] FROM [dbo].[t2] AS [t2] 
CROSS APPLY sys.[fn_PhysLocCracker](%%physloc%%) AS [fplc]
WHERE id=4582

A consulta acima me diz que o registro está localizado na página 1061

Eu uso o código abaixo para verificar quantas páginas foram carregadas no buffer para obter o resultado do meu SELECT

SELECT buffers.* FROM sys.dm_os_buffer_descriptors  buffers
INNER JOIN sys.allocation_units AS au
    ON au.[allocation_unit_id] = buffers.[allocation_unit_id]
INNER JOIN sys.partitions AS p
    ON au.[container_id] = p.[partition_id]
INNER JOIN sys.indexes AS i
    ON i.[index_id] = p.[index_id] AND p.[object_id] = i.[object_id]
WHERE p.[object_id] > 100
and [database_id] = DB_ID () AND i.[object_id]=OBJECT_ID('t2')
 ORDER BY [page_level] desc

Por que o SQL está carregando todas as páginas marcadas em verde? As páginas são carregadas por READ AHEAD ? insira a descrição da imagem aqui

sql-server sql-server-2019
  • 1 respostas
  • 65 Views
Martin Hope
user1716729
Asked: 2019-02-09 06:53:21 +0800 CST

Definir a inicialização do serviço usando DSC

  • 0

Novato na configuração de estado desejado do Windows PowerShell (DSC) aqui. A geração do arquivo MOF falha com:

PSDesiredStateConfiguration\Node : The argument is null or empty. Provide an argument that is not null or empty, and then try the command again. At line:13 char:5
+     Node localhost
+     ~~~~
    + CategoryInfo          : MetadataError: (:) [PSDesiredStateConfiguration\node], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ArgumentIsNull,PSDesiredStateConfiguration\node   Compilation errors occurred while processing configuration 'SQLConfig'. Please review the errors reported in error stream and modify your configuration code appropriately. At C:\windows\system32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\PSDesiredStateConfiguration.psm1:3917 char:5
+     throw $ErrorRecord
+     ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (SQLConfig:String) [], InvalidOperationException
    + FullyQualifiedErrorId : FailToProcessConfiguration

Roteiro

Configuration SQLConfig
{
    param(
        [Parameter(Mandatory =$true)][string[]]$serviceConfig,
        [Parameter(Mandatory =$true)][string]$DataDrive,
        [Parameter(Mandatory =$true)][string]$LogDrive

    )
    Import-DscResource -ModuleName SqlServerDsc
    Import-DscResource -ModuleName PSDesiredStateConfiguration

    Node localhost
    {
        WindowsFeature Net35
        {
            Name = 'NET-Framework-Core'
            Ensure = 'Present'
        }
        WindowsFeature Net45
        {
            Name = 'NET-Framework-45-Core'
            Ensure = 'Present'
        }
        WindowsFeature Cluster
        {
            Name = 'RSAT-Clustering'
            Ensure = 'Present'
        }

        File datadrive
        {
           Type = 'Directory'
           DestinationPath = $DataDrive
           Ensure ='Present' 

        }
        File logdrive
        {
           Type = 'Directory'
           DestinationPath = $LogDrive
           Ensure ='Present' 
        }
        SqlDatabaseDefaultLocation dataPath
        {
            InstanceName = 'MSSQLSERVER'
            Path = $DataDrive
            ServerName = 'localhost'
            Type = 'Data'
            DependsOn = '[File]datadrive'
        }
        SqlDatabaseDefaultLocation logPath
        {
            InstanceName = 'MSSQLSERVER'
            Path = $LogDrive
            ServerName = 'localhost'
            Type = 'Log'
            DependsOn = '[File]logdrive'
        }
        foreach ($service in $serviceConfig) {
            ServiceSet $service
            {
                Name = $service.ServiceName
                State = $service.State
                StartupType = $service.StartupType
                Ensure = $service.Ensure
            }


        }

    }
}

#region create configuration data

$serviceConfig=(
    @{ServiceName='MSSQLSERVER';State='Running';StartupType='Automatic';Ensure='Present'},
    @{ServiceName='SQLSERVERAGENT';State='Running';StartupType='Automatic';Ensure='Present'},
    @{ServiceName='SQLBrowser';State='Ignore';StartupType='Disabled';Ensure='Present'}
)
SQLConfig -serviceConfig $serviceConfig -DataDrive "F:\Data" -LogDrive "H:\Log" -OutputPath "C:\dump"
sql-server installation
  • 1 respostas
  • 331 Views
Martin Hope
user1716729
Asked: 2019-01-18 06:52:38 +0800 CST

Configuração do pool de armazenamento para SQL Server

  • 2

Estamos no meio da construção de um novo cluster sempre ativo do SQL Server 2017 na VM do Azure. O layout do disco de dados da VM é o seguinte

TempDb      :   2    Azure Disk Read Cache    
TempDBLog   :   1    Azure Disk No Cache    
UserDB      :   3  Azure Disk   Read Cache    
UserDBLog   :   2  Azure Disk   No Cache

Meu plano é criar um pool de armazenamento múltiplo, ou seja, pool de armazenamento TempDB com 2 discos TempDB, pool de armazenamento UserDB com 3 User db Azure Disk.

No entanto, de acordo com a documentação da Microsoft sobre SQL Server em VMs do Azure:

Se estiver usando uma técnica de distribuição de disco, como Espaços de Armazenamento, você obterá o desempenho ideal ao ter dois pools, um para o(s) arquivo(s) de log e outro para os arquivos de dados. No entanto, se você planeja usar o SQL Server Failover Cluster Instances (FCI), deverá configurar um pool.

Isso é aplicável ao Always-On ou apenas aplicável ao FCI de armazenamento compartilhado. Por favor, oriente-me, Por favor, compartilhe bons artigos/docs para referência.

Obrigado

sql-server sql-server-2016
  • 2 respostas
  • 1329 Views
Martin Hope
user1716729
Asked: 2017-09-19 01:48:40 +0800 CST

Estatísticas e estimativa de linha

  • 5

Espero que alguém possa me ajudar a aprender como o SQL Server usa estatísticas para estimar o número de registros.

Scripts de teste

USE [tempdb]

GO

CREATE TABLE t1
(
a INT NOT NULL, 
b INT NOT NULL, 
c INT CHECK (c between 1 and 50), 
CONSTRAINT pk_a primary key(a)
);

GO

INSERT INTO t1(a,b,c) 
SELECT number, number%1000+1, number%50+1 
FROM master..spt_values 
WHERE type = 'P' AND number BETWEEN 1 and 1000;

GO

CREATE STATISTICS s_b ON t1(b);
CREATE STATISTICS s_c ON t1(c);

GO

Consulta de amostra

DECLARE @c INT=300 
SELECT * FROM t1 WHERE b>@c 
SELECT * FROM t1 WHERE b>300

Consulta 1

Número estimado de linhas 300

Consulta 2

Número estimado de linhas 700

Perguntas

  1. Por que uma diferença tão grande entre a 1ª e a 2ª estimativa de linha de consulta.
  2. 2ª Consulta como SQL estimando para 700 a partir das Estatísticas
  3. Qualquer bom artigo para aprender estes.
sql-server sql-server-2016
  • 2 respostas
  • 1302 Views
Martin Hope
user1716729
Asked: 2017-08-31 06:03:58 +0800 CST

Detecção de contradição

  • 6

Estou tentando aprender particionamento de tabela. No entanto, estou lutando para entender por que o SQL Server está se comportando para uma consulta simples.

Conjunto de dados de teste

   /* --------------------------------------------------
-- Create helper function GetNums by Itzik Ben-Gan
-- http://sqlmag.com/sql-server/virtual-auxiliary-table-numbers
-- GetNums is used to insert test data
-------------------------------------------------- */

-- Drop helper function if it already exists
IF OBJECT_ID('GetNums') IS NOT NULL
    DROP FUNCTION GetNums;
GO

-- Create helper function
CREATE FUNCTION GetNums(@n AS BIGINT) RETURNS TABLE AS RETURN
  WITH
  L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
  L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
  L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
  L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
  L4   AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
  L5   AS(SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
  Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L5)
  SELECT TOP (@n) n FROM Nums ORDER BY n;
GO

/* ------------------------------------------------------------
-- Create example Partitioned Table (Heap)
-- The Partition Column is a DATE column
-- The Partition Function is RANGE RIGHT
-- The Partition Scheme maps all partitions to [PRIMARY]
------------------------------------------------------------ */

-- Drop objects if they already exist
IF EXISTS (SELECT * FROM sys.tables WHERE name = N'Sales')
    DROP TABLE Sales;
IF EXISTS (SELECT * FROM sys.partition_schemes WHERE name = N'psSales')
    DROP PARTITION SCHEME psSales;
IF EXISTS (SELECT * FROM sys.partition_functions WHERE name = N'pfSales')
    DROP PARTITION FUNCTION pfSales;

-- Create the Partition Function 
CREATE PARTITION FUNCTION pfSales (DATE)
AS RANGE right FOR VALUES 
('2013-01-01', '2014-01-01', '2015-01-01');

-- Create the Partition Scheme
CREATE PARTITION SCHEME psSales
AS PARTITION pfSales 
ALL TO ([Primary]);

-- Create the Partitioned Table (Heap) on the Partition Scheme
CREATE TABLE Sales 
(
    SalesDate DATE constraint ck_date check(SalesDate<'2016-01-01'),
    Quantity INT
) ON psSales(SalesDate);

-- Insert test data
INSERT INTO Sales(SalesDate, Quantity)
SELECT DATEADD(DAY,dates.n-1,'2012-01-01') AS SalesDate, qty.n AS Quantity
FROM GetNums(DATEDIFF(DD,'2012-01-01','2016-01-01')) dates
CROSS JOIN GetNums(1000) AS qty;

Consulta

select count(1) from sales where SalesDate>'20160101'

Consulte o plano de execução abaixo.

Plano de execução

Perguntas

  1. Por que SQL fazendo CONVERT_IMPLICIT
  2. Por que o SQL não está fazendo a detecção de contradição para evitar a verificação da tabela.

Muito Obrigado

sql-server sql-server-2016
  • 2 respostas
  • 762 Views
Martin Hope
user1716729
Asked: 2016-04-23 03:43:19 +0800 CST

Por que uma tabela do SQL Server não pode ter mais de uma coluna IDENTITY?

  • 7

Por que uma tabela do SQL Server não pode ter mais de uma coluna de identidade?

CREATE TABLE t(id INT IDENTITY, id2 INT IDENTITY)

Msg 2744, Nível 16, Estado 2, Linha 5
Múltiplas colunas de identidade especificadas para a tabela 't'.
Apenas uma coluna de identidade por tabela é permitida.

Entendo que podemos resolvê-lo usando uma coluna computada.

De acordo com a documentação do produto, uma tabela não pode ter mais de uma coluna de identidade. Mas por que? Qual é a verdadeira razão por trás disso?

sql-server identity
  • 2 respostas
  • 6921 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve