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 / dba / 问题

All perguntas(dba)

Martin Hope
Tintin
Asked: 2017-01-25 10:55:30 +0800 CST

Usar varchar(5000) seria ruim comparado a varchar(255)?

  • 37

Como varcharde qualquer maneira aloca espaço dinamicamente, minha pergunta é se o uso varchar(255)é mais eficiente ou economiza mais espaço em comparação ao uso do varchar(5000). Se sim, por quê?

sql-server
  • 1 respostas
  • 17689 Views
Martin Hope
Martin Brown
Asked: 2015-09-08 05:25:04 +0800 CST

ATUALIZE o desempenho onde nenhum dado é alterado

  • 37

Se eu tiver uma UPDATEdeclaração que na verdade não altera nenhum dado (porque os dados já estão no estado atualizado). Existe algum benefício de desempenho em colocar uma verificação na WHEREcláusula para evitar a atualização?

Por exemplo, haveria alguma diferença na velocidade de execução entre UPDATE 1 e UPDATE 2 no seguinte:

CREATE TABLE MyTable (ID int PRIMARY KEY, Value int);
INSERT INTO MyTable (ID, Value)
VALUES
    (1, 1),
    (2, 2),
    (3, 3);

-- UPDATE 1
UPDATE MyTable
SET
    Value = 2
WHERE
    ID = 2
    AND Value <> 2;
SELECT @@ROWCOUNT;

-- UPDATE 2
UPDATE MyTable
SET
    Value = 2
WHERE
    ID = 2;
SELECT @@ROWCOUNT;

DROP TABLE MyTable;

O motivo pelo qual pergunto é que preciso que a contagem de linhas inclua a linha inalterada para saber se devo fazer uma inserção se o ID não existir. Como tal, usei o formulário UPDATE 2. Se houver um benefício de desempenho ao usar o formulário UPDATE 1, é possível obter a contagem de linhas que preciso de alguma forma?

sql-server performance
  • 5 respostas
  • 58685 Views
Martin Hope
user87166
Asked: 2014-10-18 10:31:10 +0800 CST

Por que uma restrição UNIQUE permite apenas um NULL?

  • 37

Tecnicamente, NULL = NULL é False, por essa lógica nenhum NULL é igual a qualquer NULL e todos os NULLs são distintos. Isso não deveria implicar que todos os NULLs são únicos e um índice único deve permitir qualquer número de NULLs?

sql-server database-design
  • 5 respostas
  • 56513 Views
Martin Hope
SpeedBirdNine
Asked: 2013-10-30 22:00:21 +0800 CST

O índice não torna a execução mais rápida e, em alguns casos, está retardando a consulta. Por que é tão?

  • 37

Eu estava experimentando índices para acelerar as coisas, mas no caso de uma junção, o índice não está melhorando o tempo de execução da consulta e, em alguns casos, está diminuindo a velocidade.

A consulta para criar a tabela de teste e preenchê-la com dados é:

CREATE TABLE [dbo].[IndexTestTable](
    [id] [int] IDENTITY(1,1) PRIMARY KEY,
    [Name] [nvarchar](20) NULL,
    [val1] [bigint] NULL,
    [val2] [bigint] NULL)

DECLARE @counter INT;
SET @counter = 1;

WHILE @counter < 500000
BEGIN
    INSERT INTO IndexTestTable
      (
        -- id -- this column value is auto-generated
        NAME,
        val1,
        val2
      )
    VALUES
      (
        'Name' + CAST((@counter % 100) AS NVARCHAR),
        RAND() * 10000,
        RAND() * 20000
      );

    SET @counter = @counter + 1;
END

-- Index in question
CREATE NONCLUSTERED INDEX [IndexA] ON [dbo].[IndexTestTable]
(
    [Name] ASC
)
INCLUDE (   [id],
    [val1],
    [val2])

Agora a consulta 1, que foi melhorada (apenas um pouco, mas a melhoria é consistente) é:

SELECT *
FROM   IndexTestTable I1
       JOIN IndexTestTable I2
            ON  I1.ID = I2.ID
WHERE  I1.Name = 'Name1'

Estatísticas e plano de execução sem índice (neste caso, a tabela usa o índice clusterizado padrão):

(5000 row(s) affected)
Table 'IndexTestTable'. Scan count 2, logical reads 5580, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 109 ms,  elapsed time = 294 ms.

insira a descrição da imagem aqui

Agora com o índice ativado:

(5000 row(s) affected)
Table 'IndexTestTable'. Scan count 2, logical reads 2819, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 94 ms,  elapsed time = 231 ms.

insira a descrição da imagem aqui

Agora, a consulta que fica mais lenta devido ao índice (a consulta não tem sentido, pois é criada apenas para teste):

SELECT I1.Name,
       SUM(I1.val1),
       SUM(I1.val2),
       MIN(I2.Name),
       SUM(I2.val1),
       SUM(I2.val2)
FROM   IndexTestTable I1
       JOIN IndexTestTable I2
            ON  I1.Name = I2.Name
WHERE   
       I2.Name = 'Name1'
GROUP BY
       I1.Name

Com o índice clusterizado ativado:

(1 row(s) affected)
Table 'IndexTestTable'. Scan count 4, logical reads 60, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 1, logical reads 155106, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 17207 ms,  elapsed time = 17337 ms.

insira a descrição da imagem aqui

Agora com o Index desabilitado:

(1 row(s) affected)
Table 'IndexTestTable'. Scan count 5, logical reads 8642, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 2, logical reads 165212, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 17691 ms,  elapsed time = 9073 ms.

insira a descrição da imagem aqui

As perguntas são:

  1. Mesmo que o índice seja sugerido pelo SQL Server, por que ele retarda as coisas por uma diferença significativa?
  2. Qual é a junção Nested Loop que está demorando mais e como melhorar seu tempo de execução?
  3. Há algo que estou fazendo de errado ou deixei passar?
  4. Com o índice padrão (somente na chave primária), por que leva menos tempo e com o índice não clusterizado presente, para cada linha na tabela de junção, a linha da tabela unida deve ser encontrada mais rapidamente, porque a junção está na coluna Nome na qual o índice foi criado. Isso se reflete no plano de execução da consulta e o custo de Index Seek é menor quando o IndexA está ativo, mas por que ainda mais lento? Além disso, o que está na junção externa esquerda do loop aninhado que está causando a lentidão?

Usando o SQLServer 2012

sql-server index
  • 2 respostas
  • 25235 Views
Martin Hope
BlueChippy
Asked: 2013-08-21 22:01:52 +0800 CST

A ordem das colunas em um índice PK é importante?

  • 37

Tenho algumas tabelas muito grandes com a mesma estrutura básica. Cada um tem uma coluna RowNumber (bigint)e . DataDate (date)Os dados são carregados usando SQLBulkImport todas as noites e nenhum dado "novo" é carregado - é um registro histórico (SQL Standard, não Enterprise, portanto, sem particionamento).

Como cada bit de dados precisa ser vinculado a outros sistemas e cada RowNumber/DataDatecombinação é única, essa é minha chave primária.

Percebo que pela forma como defini o PK no SSMS Table Designer, RowNumberestá listado primeiro e DataDatesegundo.

Também noto que minha fragmentação é sempre MUITO alta ~ 99%.

Agora, como cada um DataDateaparece apenas uma vez, eu esperaria que o indexador apenas adicionasse às páginas todos os dias, mas me pergunto se ele realmente está indexando com base no RowNumberprimeiro e, portanto, tendo que mudar todo o resto?


Rownumbernão é uma coluna de identidade, é um int gerado por um sistema externo (infelizmente). Ele redefine no início de cada DataDate.

Dados de Exemplo

RowNumber | DataDate | a | b | c..... 
   1      |2013-08-01| x | y | z 
   2      |2013-08-01| x | y | z 
...
   1      |2013-08-02| x | y | z 
   2      |2013-08-02| x | y | z 
...

Os dados estão sendo carregados em RowNumberordem, um DataDatepor carregamento.

O processo de importação é bcp - tentei carregar em uma tabela temporária e, em seguida, selecionar em ordem a partir daí ( ORDER BY RowNumber, DataDate), mas ainda sai alta fragmentação.

sql-server sql-server-2008-r2
  • 2 respostas
  • 12551 Views
Martin Hope
Jack
Asked: 2013-02-22 23:49:52 +0800 CST

O login já tem uma conta com um nome de usuário diferente

  • 37

Quando executo este SQL:

USE ASPState
GO
IF NOT EXISTS(SELECT * FROM sys.sysusers WHERE NAME = 'R2Server\AAOUser')
CREATE USER [R2Server\AAOUser] FOR LOGIN [R2Server\AAOUser];
GO

Estou tendo o erro a seguir:

O login já tem uma conta com um nome de usuário diferente.

Como posso saber qual é esse nome de usuário diferente para minha conta de login?

sql-server security
  • 3 respostas
  • 92731 Views
Martin Hope
Stuart Blackler
Asked: 2012-12-13 19:05:36 +0800 CST

APAGAR vs TRUNCAR

  • 37

Estou tentando entender melhor as diferenças entre os comandos DELETEe . TRUNCATEMinha compreensão dos internos é algo como:

DELETE-> o mecanismo de banco de dados encontra e remove a linha das páginas de dados relevantes e todas as páginas de índice onde a linha é inserida. Assim, quanto mais índices, mais demora a exclusão.

TRUNCATE-> simplesmente remove todas as páginas de dados da tabela em massa, tornando esta uma opção mais eficiente para excluir o conteúdo de uma tabela.

Supondo que o acima esteja correto (por favor, corrija-me se não):

  1. Como diferentes modos de recuperação afetam cada instrução? Se houver algum efeito
  2. Ao excluir, todos os índices são verificados ou apenas aqueles onde a linha está? Eu diria que todos os índices são verificados (e não procurados?)
  3. Como os comandos são replicados? O comando SQL é enviado e processado em cada assinante? Ou o MSSQL é um pouco mais inteligente do que isso?
sql-server database-internals
  • 2 respostas
  • 22366 Views
Martin Hope
孔夫子
Asked: 2012-10-25 12:56:44 +0800 CST

Para desempenho absoluto, SUM é mais rápido ou COUNT?

  • 37

Isso está relacionado à contagem do número de registros que correspondem a uma determinada condição, por exemplo, invoice amount > $100.

eu costumo preferir

COUNT(CASE WHEN invoice_amount > 100 THEN 1 END)

No entanto, isso é tão válido

SUM(CASE WHEN invoice_amount > 100 THEN 1 ELSE 0 END)

Eu teria pensado que COUNT é preferível por 2 razões:

  1. Transmite a intenção, que éCOUNT
  2. COUNT provavelmente envolve uma i += 1operação simples em algum lugar, enquanto SUM não pode contar com sua expressão como um valor inteiro simples.

Alguém tem fatos específicos sobre a diferença em RDBMS específicos?

sql-server mysql
  • 3 respostas
  • 40150 Views
Martin Hope
David
Asked: 2012-09-25 11:08:09 +0800 CST

Como (e por que) o TOP impacta um plano de execução?

  • 37

Para uma consulta moderadamente complexa que estou tentando otimizar, notei que a remoção da TOP ncláusula altera o plano de execução. Eu teria imaginado que, quando uma consulta inclui TOP no mecanismo de banco de dados, executaria a consulta ignorando a TOPcláusula e, no final, apenas reduziria o resultado definido para o número n de linhas solicitadas. O plano de execução gráfico parece indicar que este é o caso -- TOPé a "última" etapa. Mas parece que há mais coisas acontecendo.

Minha pergunta é: como (e por que) uma cláusula TOP n afeta o plano de execução de uma consulta?

Aqui está uma versão simplificada do que está acontecendo no meu caso:

A consulta está correspondendo linhas de duas tabelas, A e B.

Sem a TOPcláusula, o otimizador estima que haverá 19.000 linhas da tabela A e 46.000 linhas da tabela B. O número real de linhas retornadas é 16.000 para A e 13.000 para B. Uma correspondência de hash é usada para unir esses dois conjuntos de resultados para um total de 69 linhas (então uma classificação é aplicada). Esta consulta acontece muito rapidamente.

Quando adiciono TOP 1001o otimizador não usa uma correspondência de hash; em vez disso, ele primeiro classifica os resultados da tabela A (mesma estimativa/real de 19k/16k) e faz um loop aninhado na tabela B. O número estimado de linhas para a tabela B agora é 1, e o estranho é que TOP nafeta diretamente o número estimado de execuções (busca de índice) contra B - parece ser sempre 2n+1 ou, no meu caso, 2003. Essa estimativa muda de acordo se eu mudar TOP n. Obviamente, como essa é uma junção aninhada, o número real de execuções é 16k (o número de linhas da tabela A) e isso torna a consulta mais lenta.

A consulta tem uma ORDER BYcláusula. Adicionar TOPalterações onde no plano esse tipo ocorre, mas estou mais preocupado em como isso afeta o número de execuções de buscas de índice em relação à tabela B.

O cenário real é um pouco mais complexo, mas captura a ideia/comportamento básico. Ambas as tabelas são pesquisadas usando buscas de índice. Esta é a edição SQL Server 2008 R2 Enterprise.

sql-server query-performance
  • 2 respostas
  • 11557 Views
Martin Hope
Bruno
Asked: 2012-02-10 11:03:34 +0800 CST

Como converter um inteiro para um booleano em uma cláusula MySQL SELECT?

  • 37

Eu sou novo aqui, então seja gentil comigo. Tenho o seguinte cenário:

Eu tenho muitas tabelas que, por uma questão de simplicidade, são representadas em uma View no meu banco de dados MySQL. Meu problema é que preciso de um valor nessa view representando se é um tipo de evento ou outro (um booleano simples), que tentei alcançar com:

`gu`.`StoppingUnitEventME` = `ese`.`MonitoringElement` AS `IsStopingEvent`

O resultado é representado como int e, portanto, é lido pelo Entity Framework. O problema é que eu realmente preciso de um valor de retorno booleano, que tentei alcançar com:

CAST((`gu`.`StoppingUnitEventME` = `ese`.`MonitoringElement`) as boolean) AS `IsStopingEvent` 

Isso resultou em um erro, que não é exibido para mim no MySQL Workbench (só recebo aquele irritante "Você tem um erro em ...").

Vocês podem por favor me ajudar?

Tentei resolver isso na minha aplicação, mas eu realmente prefiro isso resolvido no banco de dados, pois ele será usado por outros softwares posteriormente.

mysql select
  • 7 respostas
  • 147046 Views
Prev
Próximo

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