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-43869

ToC's questions

Martin Hope
ToC
Asked: 2024-11-20 03:53:40 +0800 CST

Sql Server: Consulta para analisar e validar códigos

  • 6

Temos uma tabela #ValidCode com uma lista de códigos válidos como: 'A', 'B', 'C', etc. Outra tabela chamada #SourceData com dados de entrada — que vêm como uma combinação de tokens válidos e inválidos (às vezes duplicados).

Ex:

  • 'A;B;C' ( válido )
  • 'A;A;A;A;A;B' ( Válido )
  • 'ad;df;A;B' ( inválido )

Tentando encontrar uma abordagem de consulta ótima para processar essas strings para encontrar linhas válidas em #SourceData . Veja o exemplo abaixo:

DROP TABLE IF EXISTS #ValidCode
GO
CREATE TABLE #ValidCode
(
      ID        INT             IDENTITY(1,1)
    , Code      CHAR(1)
)
INSERT INTO #ValidCode (Code) VALUES ('A'), ('B'), ('C')
GO
DROP TABLE IF EXISTS #SourceData 
GO
CREATE TABLE #SourceData 
(
      ID        INT             IDENTITY(1,1)
    , Codes     VARCHAR(500)
    , Is_Valid  BIT
    , Is_Split  BIT
)

INSERT INTO #SourceData (Codes) 
VALUES    ('A;B;C')
        , ('B;A')
        , ('B;B;B;C;C;A;A;B')
        , ('B;Z;1')
        , ('B;ss;asd')


SELECT * FROM #ValidCode
SELECT * FROM #SourceData

A consulta processaria os dados na tabela #SourceData e atualizaria o sinalizador Is_Valid para que eles pudessem ser consumidos no processo subsequente.

Regras :

  • Cada token deve ser válido para que toda a linha da coluna seja válida (linhas 1 a 3)
  • Mesmo que um token seja inválido, o valor da linha inteira será inválido (linhas 4 e 5)

Então, esta é a saída preferida:

EU IA Códigos É_válido
1 ABC 1
2 B;Um 1
3 B;B;B;C;C;A;A;B 1
4 B;Z;1 0
5 B;ss;asd 0

Abordagem atual : Faça um loop por cada linha em #SourceData e divida-as no delimitador ';', depois compare-as com a tabela #ValidCode . Se todos os tokens forem individualmente válidos, marque a linha em #SourceData como válida ( flag Is_Valid ). Caso contrário, marque como inválida. A WHILEabordagem de loop funciona, mas é lenta.

O #SourceData pode ter até 3 milhões de linhas. Com cada linha tendo várias combinações de valores válidos duplicados ('A;A;A;A') e inválidos ('A;as;sdf;B')

Existe uma abordagem melhor?

Obrigado!

query-performance
  • 2 respostas
  • 53 Views
Martin Hope
ToC
Asked: 2024-08-15 05:44:04 +0800 CST

Bloqueio entre duas consultas MERGE inseridas na mesma tabela

  • 13

Cenário

Eu tenho uma tabela grande particionada em uma INTcoluna. Quando executo duas MERGEinstruções diferentes em duas partições diferentes desta tabela, elas parecem estar bloqueando uma à outra.

Exemplo de código para recriar o cenário:

1. Preparação. Crie tabelas e alguns dados fictícios

SET NOCOUNT ON
GO
--
--  Create parition function and partition scheme
--
    DROP FUNCTION IF EXISTS PF_Site_ID 
    GO
    CREATE PARTITION FUNCTION PF_Site_ID (INT)  
        AS RANGE RIGHT FOR VALUES   (
                                        0,
                                        1, 2, 3, 4, 5, 6, 7, 8, 9, 10
                                    )
    GO  
    DROP PARTITION SCHEME PS_Site_ID
    GO
    CREATE PARTITION SCHEME PS_Site_ID
        AS PARTITION PF_Site_ID
        ALL TO ('PRIMARY')
    GO

--
-- Large table partitioned on Site_ID. Two STG tables. And some dummy data
--
    DROP TABLE IF EXISTS dbo.PartitionedLargeTable
    GO
    CREATE TABLE dbo.PartitionedLargeTable
    (
          ID       INT          NOT NULL IDENTITY(1,1)
        , Site_ID  INT          NOT NULL
        , Name     VARCHAR(50)
    ) ON PS_Site_ID (Site_ID)
    GO
    ALTER TABLE dbo.PartitionedLargeTable SET (LOCK_ESCALATION = AUTO)
    GO

--
--  STG tables
--
    DROP TABLE IF EXISTS dbo.STG_Test1
    GO
    CREATE TABLE dbo.STG_Test1
    (
          ID       INT          NOT NULL IDENTITY(1,1)
        , Site_ID  INT          NOT NULL
        , Name     VARCHAR(50)
    ) ON [PRIMARY]
    GO
    DROP TABLE IF EXISTS dbo.STG_Test2
    GO
    CREATE TABLE dbo.STG_Test2
    (
          ID       INT          NOT NULL IDENTITY(1,1)
        , Site_ID  INT          NOT NULL
        , Name     VARCHAR(50)
    ) ON [PRIMARY]
    GO

--
--  Dummy data
--
    INSERT INTO dbo.PartitionedLargeTable (Site_ID, Name) SELECT 1, NEWID()
    INSERT INTO dbo.PartitionedLargeTable (Site_ID, Name) SELECT 2, NEWID()
    GO 10000

    INSERT INTO dbo.PartitionedLargeTable (Site_ID, Name)
    SELECT Site_ID, Name FROM dbo.PartitionedLargeTable
    GO 5

    INSERT INTO dbo.STG_Test1(Site_ID, Name) SELECT 1, NEWID()
    GO 10000
    INSERT INTO dbo.STG_Test2(Site_ID, Name) SELECT 2, NEWID()
    GO 10000

    INSERT INTO dbo.STG_Test1 (Site_ID, Name)
    SELECT Site_ID, Name FROM dbo.STG_Test1
    GO 7

    INSERT INTO dbo.STG_Test2 (Site_ID, Name)
    SELECT Site_ID, Name FROM dbo.STG_Test2
    GO 7

2. MESCLAR 1

Em uma janela do SSMS, execute esta MERGEinstrução:

MERGE dbo.PartitionedLargeTable AS TGT

USING (SELECT ID, Site_ID, Name FROM dbo.STG_Test1) AS SRC
    ON  SRC.Site_ID = TGT.Site_ID
    AND SRC.ID      = TGT.ID

WHEN MATCHED THEN
    UPDATE 
        SET TGT.Name = SRC.Name

WHEN NOT MATCHED THEN
    INSERT (Site_ID, Name)
    VALUES (SRC.Site_ID, SRC.Name);

3. MESCLAR 2

Em uma segunda janela do SSMS, execute esta MERGEinstrução:

MERGE dbo.PartitionedLargeTable AS TGT

USING (SELECT ID, Site_ID, Name FROM dbo.STG_Test2) AS SRC
    ON  SRC.Site_ID = TGT.Site_ID
    AND SRC.ID      = TGT.ID

WHEN MATCHED THEN
    UPDATE 
        SET TGT.Name = SRC.Name

WHEN NOT MATCHED THEN
    INSERT (Site_ID, Name)
    VALUES (SRC.Site_ID, SRC.Name);

As duas MERGEinstruções são executadas em Site_IDs diferentes (portanto, duas partições diferentes).

Um dos benefícios de desempenho das tabelas particionadas é que podemos manipular partições independentemente umas das outras (dentro do razoável). Portanto, algo como INSERTou UPDATEem uma partição não bloqueará operações semelhantes em outras partições.

Compare isso com quando a tabela NÃO está particionada, se realizarmos duas INSERToperações grandes (ou duas UPDATEoperações grandes), então uma bloqueia a outra quando o número de linhas manipuladas ultrapassa um certo número (algo como 3k ou 5k linhas), então o PAGElock é escalado para TABLOCK. Portanto, INSERTblocos INSERT(ou UPDATEblocos UPDATE)

Para evitar esse escalonamento de bloqueio para TABLOCK, esta tabela foi particionada com LOCK_ESCALATION = AUTO, que limita os bloqueios até o nível HOBT (e não a tabela). Mas com MERGEo bloqueio ainda acontece.

Alguma idéia de como evitar esse bloqueio? Temos 10 MERGEinstruções paralelas em execução, em 10 partições diferentes desta grande tabela (e elas estão bloqueando umas às outras).

A imagem abaixo mostra a natureza do bloqueio. Quando uma tabela é particionada, o escalonamento de bloqueio deve ir apenas até a partição (não até a tabela inteira). Quando essas MERGEinstruções estão em execução, vejo os IDs do HOBT que cada um MERGEestá consultando (bloqueando). E em alguns casos, o ID HOBT não corresponde aos IDs de partição desta tabela.

insira a descrição da imagem aqui

A tabela real com a qual trabalho possui um COLUMNSTORE CLUSTEREDíndice no esquema de particionamento.

sql-server
  • 2 respostas
  • 518 Views
Martin Hope
ToC
Asked: 2016-05-26 09:08:16 +0800 CST

Powershell: O uso de System.Data.SqlClient.SqlDataAdapter no powershell precisa de alguma instalação do ADO.Net?

  • 1

No PowerShell, o objetivo é consultar alguns dados do Sql Server e colocá-los em um arquivo Excel pré-formatado. Para isso, o seguinte snippet de script do PowerShell gera um erro dizendo "faltam assemblies".

Pelo que pude reunir online, SqlClient.SqlDataAdapterfaz parte do ADO.Net, que não requer a inclusão de nenhum assemblie ( já que está sempre presente na instalação do OS .Net framework ). Isso está correto? Como faço para corrigir isso?

...
... other connection code
...
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.Connection = $SqlConnection;
$SqlCmd.CommandText = $ActiveTransactions_Count_Query;

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
$SqlAdapter.SelectCommand = $SqlCmd;

$DataSet_ActiveTransaction = New-Object System.Data.DataSet;
$SqlAdapter.Fill($DataSet_ActiveTransaction);
$DataSetTable = $DataSet_ActiveTransaction.Tables[0];
$DataSetTable

Erro:

New-Object : Cannot find type [Sql.Data.SqlClient.SqlDataAdapter]: make sure
the assembly containing this type is loaded.
At M:\Build.ps1:21 char:25 + $SqlAdapter = New-Object <<<< 
Sql.Data.SqlClient.SqlDataAdapter;
    + CategoryInfo          : InvalidType: (:) [New-Object],
    PSArgumentException
    + FullyQualifiedErrorId :     TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
sql-server-2008-r2 scripting
  • 1 respostas
  • 1438 Views
Martin Hope
ToC
Asked: 2015-07-24 07:23:53 +0800 CST

Licenciamento e Cluster do SQL Server para Grupos de Disponibilidade

  • 1

Para o SQL Server 2014, a leitura deste link do MSDN e do arquivo Microsoft PDF sobre licenciamento gerou algumas dúvidas.

  • Para Grupos de Disponibilidade, precisamos de WSFC ou FCI?
  • Como o WSFC e o FCI são diferentes?
  • Se precisarmos apenas de 2 nós AG, o SQL Server Standard Edition funcionaria?
sql-server sql-server-2014
  • 1 respostas
  • 6466 Views
Martin Hope
ToC
Asked: 2015-05-22 06:19:18 +0800 CST

No Sql Server, qual é a diferença entre VAS e Buffer Pool?

  • 2

Meu entendimento:

No Servidor SQL,

  • Buffer Pool é onde todos os Data/Proc/Log Cache , etc estão localizados.
  • Espaço de endereço virtual é um local lógico que se refere a locais físicos (na RAM ou no arquivo de paginação).

Mas esta afirmação é confusa para mim:

"..A alocação de MultiPage ocorre na área VAS e a alocação de página única vem do Buffer Pool..."

Qual é a diferença entre Buffer Pool e VAS?

sql-server buffer-pool
  • 1 respostas
  • 4287 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