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
Jason
Asked: 2016-12-17 06:54:09 +0800 CST

Comparação de desempenho entre o uso da função Join e Window para obter valores de lead e lag

  • 19

Eu tenho uma tabela com 20 milhões de linhas e cada linha tem 3 colunas: time, ide value. Para cada ide time, há um valuepara o status. Eu quero saber os valores de lead e lag de um certo timepara um específico id.

Eu usei dois métodos para conseguir isso. Um método está usando join e outro método está usando as funções de janela lead/lag com índice clusterizado ativado timee id.

Comparei o desempenho desses dois métodos pelo tempo de execução. O método join leva 16,3 segundos e o método window function leva 20 segundos, sem incluir o tempo para criar o índice. Isso me surpreendeu porque a função da janela parece ser avançada enquanto os métodos de junção são força bruta.

Aqui está o código para os dois métodos:

Criar índice

create clustered index id_time
 on tab1 (id,time)

Método de junção

select a1.id,a1.time
   a1.value as value, 
   b1.value as value_lag,
   c1.value as value_lead
into tab2
from tab1 a1
left join tab1 b1
on a1.id = b1.id
and a1.time-1= b1.time
left join tab1 c1
on a1.id = c1.id
and a1.time+1 = c1.time

Estatísticas de IO geradas usando SET STATISTICS TIME, IO ON:

Estatísticas para método de junção

Aqui está o plano de execução para o método join

Método de função de janela

select id, time, value, 
   lag(value,1) over(partition by id order by id,time) as value_lag,
   lead(value,1) over(partition by id order by id,time) as value_lead
into tab2
from tab1

(Ordenar apenas por timeeconomiza 0,5 segundos.)

Aqui está o plano de execução para o método de função Window

estatísticas de IO

[Estatísticas para o método de função de janela 4]


Eu verifiquei os dados sample_orig_month_1999e parece que os dados brutos estão bem ordenados por ide time. Esta é a razão da diferença de desempenho?

Parece que o método join tem mais leituras lógicas do que o método window function, enquanto o tempo de execução para o primeiro é realmente menor. É porque o primeiro tem um paralelismo melhor?

Eu gosto do método de função de janela por causa do código conciso, existe alguma maneira de acelerá-lo para esse problema específico?

Estou usando o SQL Server 2016 no Windows 10 64 bits.

sql-server performance
  • 1 respostas
  • 15341 Views
Martin Hope
Jonathan Wheeler
Asked: 2016-08-23 15:38:19 +0800 CST

Como determino por que um documento do MongoDB está falhando na validação?

  • 19

Como determino por que uma inserção de documento do MongoDB está falhando na validação? Tudo o que recebo é um writeError que diz "Falha na validação do documento", o que não é muito útil.

(Isso acontece com frequência e gostaria de entender como depurá-los corretamente, em vez de pedir ajuda com um exemplo específico.)

mongodb debugging
  • 2 respostas
  • 19815 Views
Martin Hope
d9k
Asked: 2016-08-08 19:22:44 +0800 CST

psql 9.5: gen_random_uuid() não funciona

  • 19

SELECT gen_random_uuid()

produz saída

ERROR:  function gen_random_uuid() does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.

Executei CREATE EXTENSION pgcrypto;no banco de dados selecionado e SELECT gen_random_bytes(1)funciona perfeitamente ( gen_random_bytesnão funciona em outros bancos de dados em que a pgcryptoextensão não foi criada manualmente).

% psql --version
psql (PostgreSQL) 9.5.3

A versão do Ubuntu é 16.04.

postgresql-9.5 uuid
  • 1 respostas
  • 38710 Views
Martin Hope
Maulik Patel
Asked: 2016-08-03 05:33:05 +0800 CST

Localização do registro de erros?

  • 19

O MySQL grava qualquer arquivo de log? Se sim, qual é o caminho dele (no Ubuntu/Linux)?

mysql log
  • 7 respostas
  • 119826 Views
Martin Hope
jase81
Asked: 2016-07-27 16:27:41 +0800 CST

Como entrar na mesma mesa várias vezes?

  • 19

Eu tenho duas tabelas, "hierarchy_table" e "name_table".

A tabela de hierarquia contém um objeto que tem vários pais e filhos. Cada pai e filho é referenciado por id.

|  object_id  |  parent_id_1  |  parent_id_2  |  child_id_1  |  child_id_2  |
-----------------------------------------------------------------------------
|     1234    |      9999     |      9567     |     5555     |     5556     |
-----------------------------------------------------------------------------

Cada id de objeto na hierarquia_tabela tem uma entrada na tabela_nome:

|  name_id  |    name    |
--------------------------
|   1234    |   ABCD     |
--------------------------
|   9999    |   ZYXW     |
--------------------------
| ...

Como faço para unir cada id na hierarquia_table à name_table várias vezes para que eu possa ter um resultado em que todos os nomes sejam preenchidos?

Assim:

|   object    |   parent_1    |   parent_2    |   child_1    |   child_2    |
-----------------------------------------------------------------------------
|     ABCD    |      ZYXW     |      BBBB     |     CCCC     |     DDDD     |
-----------------------------------------------------------------------------

Nota: os nomes das tabelas no exemplo são apenas para clareza/simplicidade, os nomes reais têm nomes próprios.

postgresql join
  • 3 respostas
  • 75452 Views
Martin Hope
R Kiselev
Asked: 2016-07-20 00:53:31 +0800 CST

Para que serve o banco de dados especial "postgres"?

  • 19

Eu tenho um servidor PostgreSQL com vários bancos de dados em execução. Um dos bancos de dados se chama postgres, e estava lá desde o início. Não consegui ver nenhuma tabela dentro e nunca usei explicitamente, mas notei que qualquer usuário pode criar tabelas dentro do banco de dados (não é isso que eu quero - não quero que nenhum usuário, exceto o administrador, crie qualquer tabela em qualquer lugar).

Tenho a sensação de que é algum tipo de banco de dados especial necessário para o funcionamento normal do servidor, mas qual é exatamente a sua finalidade? Que tipo de dados é (ou poderia ser) armazenado dentro? Ele contém os metadados sobre outros bancos de dados (por exemplo, o information_schema?). Algo desagradável pode acontecer, se eu revogar connecto privilégio público para este banco de dados? Ou se eu deixar cair?

Pesquisei meia hora no Google, mas sempre consegui coisas completamente não relacionadas, porque a palavra postgrestambém é usada para o usuário postgrese o próprio DBMS.

postgresql
  • 1 respostas
  • 3265 Views
Martin Hope
elmer007
Asked: 2016-06-10 15:11:25 +0800 CST

Por que um backup diferencial não pode especificar sua base?

  • 19

Este é meu primeiro post DBA.SE, então por favor me informe sobre qualquer erro, obrigado!

Sou um novo DBA (não um profissional de TI, apenas mais ninguém na empresa para fazer isso), portanto, quanto mais básica a explicação, melhor. Tenho lido sobre estratégias de backup de banco de dados (ou, como aprendi a chamá-las, "estratégias de restauração"). Entendo o que os backups completos, diferenciais e de log de transações fazem, mas quero saber por que um backup diferencial só pode ser baseado no backup completo mais recente.

Se um backup diferencial é tudo o que mudou desde o último backup completo, por que o diferencial não pode ser baseado em nenhum backup de minha escolha? Para ser mais claro, estou perguntando sobre especificar a base quando o backup é feito , não ao restaurar. Estou assumindo que ao restaurar você escolheria a base correta e o diferencial correspondente para realizar a restauração (não usar um diferencial feito da base B para restaurar da base A).

Qual é o motivo que impede que essa funcionalidade seja possível? Acho que deve haver uma razão, só não sei qual é.

Nota: Entendo que a base não pode ser especificada, mas minha dúvida é por que não ? (Também não estou interessado em discussões sobre "por que você faria isso?")

Analogia

Aqui está uma analogia de como eu entendo um backup diferencial:

Eu tenho um arquivo do Excel com alguns dados nas células.

No dia 1, faço uma cópia desse arquivo e o armazeno em outro lugar (o "backup completo").

No dia 2, eu olho para o arquivo e comparo com a cópia de backup que fiz no dia 1, e anoto todas as células que foram alteradas e quais são seus novos valores (um "backup diferencial"). Não estou anotando todas as alterações feitas em uma célula, apenas qual é o seu valor final. Se a célula A1 começasse como "Alfred", mudasse para "Betty", "Charlie" e depois "Dave", eu observaria apenas que "A1 agora é Dave".

No dia 3, comparo o arquivo atual com o arquivo de backup novamente e observo as alterações (outro "backup diferencial" com a mesma base do dia 2). Novamente, anotando apenas os valores finais por célula no horário observado, não todos os valores que a célula ficou ao longo do dia.

No dia 4, comparo novamente e observo as mudanças novamente. Continuando com a célula A1, agora diz "Sarah", mesmo que fossem 10 outros nomes ao longo do dia, e tudo que noto é "Agora A1 é Sarah".

No dia 5, meu arquivo fica confuso; então, vejo a cópia de backup que fiz no dia 1, depois os estados finais anotados no dia 4 e aplico as alterações anotadas na cópia de backup e agora tenho o arquivo "restaurado" como estava no dia 4 Então, eu olho para o backup feito no dia 1, vejo que no dia 4 a célula A1 terminou como "Sarah", e altero a célula de backup A1 para "Sarah".

Por que importaria se eu tivesse feito outra cópia de backup ("completa") do arquivo no dia 2? Por que ainda não seria possível comparar (leia-se, "fazer um backup diferencial de") o arquivo no dia 3 ou 4 com a cópia feita no dia 1? Pelo que entendi, o SQL Server exigiria que eu comparasse (ao fazer outro backup diferencial) com um backup completo feito no dia 2 (se um tivesse sido feito) - nenhuma outra opção.

sql-server backup
  • 4 respostas
  • 2626 Views
Martin Hope
Marin Mohanadas
Asked: 2016-05-25 07:27:07 +0800 CST

Capitalize apenas a primeira letra de cada palavra de cada frase no SQL Server

  • 19

Quero capitalizar apenas a primeira letra de cada palavra de cada frase em uma coluna SQL.

Por exemplo, se a frase for:

'Eu gosto de filmes'

então eu preciso da saída:

'Eu gosto de filmes'

Consulta:

declare @a varchar(15) 

set @a = 'qWeRtY kEyBoArD'

select @a as [Normal text],
upper(@a) as [Uppercase text],
lower(@a) as [Lowercase text],
upper(left(@a,1)) + lower(substring(@a,2,len(@a))) as [Capitalize first letter only]

Aqui eu coloquei a primeira letra superior, inferior e maiúscula apenas na minha coluna (aqui coloquei apenas uma palavra aleatória).

Aqui estão meus resultados:

insira a descrição da imagem aqui

Existe alguma possibilidade de fazer isso?

Alguma possibilidade de obter resultados sem usar a função definida pelo usuário?

Eu preciso da saídaQwerty Keyboard

sql-server sql-server-2014
  • 13 respostas
  • 101605 Views
Martin Hope
GordonLiddy
Asked: 2016-05-23 12:12:09 +0800 CST

Planejar o tamanho do cache e a memória reservada

  • 19

Ao executar uma consulta incluindo o plano de execução real, o operador raiz ( SELECT) informa que o tamanho do plano em cache é 32 KB.

Uma consulta que une sys.dm_exec_cached_planse sys.dm_os_memory_objects, examinando o plano em questão, diz que os valores para pages_in_bytese max_pages_in_bytessão 32768 (32 KB), o que corresponde ao tamanho do plano armazenado em cache.

O que não entendo é o que significa o valor em sys.dm_exec_cached_plans.size_in_bytes, que é 49152 (48 KB). Eu li BOL em todas essas colunas e, especialmente, size_in_bytesque diz:

" Número de bytes consumidos pelo objeto de cache. "

Não consigo colocar a última peça do quebra-cabeça no lugar, para entender o que realmente significa.

Eu sei que todos os operadores (sem falar sobre a concessão de memória adicional usada para classificações e hashes) requerem alguma quantidade de memória fixa, para armazenar estado, fazer cálculos etc., que é armazenado com o plano otimizado no cache, mas onde?

Então, minhas perguntas são:

  • O que size_in_bytesrealmente significa
  • Por que é um valor maior do que "Tamanho do plano em cache"?
  • Onde está reservada a quantidade fixa de memória para todos os operadores/iteradores, é com o "Tamanho do plano em cache" (32Kb no meu exemplo) ou em qualquer outro lugar?

Sei que são Detran diferentes com funções diferentes, mas estão relacionados. Os planos compilados (em cache) em sys.dm_exec_cached_plansjunções sys.dm_os_memory_objectsna memory_object_addresscoluna. O motivo de postar as perguntas aqui, é que estou pedindo ajuda sobre isso, entendendo como interpretar os DMVs e suas colunas.

Se size_in_bytesfor o tamanho do plano em cache, por que o SQL Server informa outro valor no plano de execução real?

Nova consulta, novos números:

  • Plano real
    • Tamanho do plano em cache 16 KB
    • CompileMemory 96KB
  • Detran:
    • sys.dm_exec_cached_plans.size_in_bytes24 KB
    • sys.dm_os_memory_objects.pages_in_bytes, .max_pages_in_bytes16 KB.

Além disso, observe que esta consulta não requer nenhuma concessão de memória adicional para classificações e operações de hash.

Microsoft SQL Server 2012 - 11.0.5343.0 (X64)
sql-server sql-server-2012
  • 2 respostas
  • 5894 Views
Martin Hope
Alex Shelemin
Asked: 2016-04-27 14:30:12 +0800 CST

LOB_DATA, varreduras de tabela lentas e algumas questões de E/S

  • 19

Eu tenho uma tabela bastante grande com uma das colunas sendo dados XML com um tamanho médio de entrada XML de aproximadamente 15 kilobytes. Todas as outras colunas são ints regulares, bigints, GUIDs etc. Para ter alguns números concretos, digamos que a tabela tenha um milhão de linhas e tenha aproximadamente 15 GB de tamanho.

O que notei é que esta tabela é muito lenta para selecionar dados se eu quiser selecionar todas as colunas. Quando eu faço

SELECT TOP 1000 * FROM TABLE

leva cerca de 20 a 25 segundos para ler os dados do disco - mesmo que eu não imponha nenhuma ordem no resultado. Eu executo a consulta com o cache frio (ou seja, após DBCC DROPCLEANBUFFERS). Aqui estão os resultados das estatísticas de IO:

Contagem de varredura 1, leituras lógicas 364, leituras físicas 24, leituras antecipadas 7191, leituras lógicas lob 7924, leituras físicas lob 1690, leituras antecipadas lob 3968.

Ele pega ~ 15 MB de dados. O plano de execução mostra o Clustered Index Scan como eu esperava.

Não há nenhum IO acontecendo no disco além de minhas consultas; Também verifiquei se a fragmentação do índice clusterizado está próxima de 0%. Esta é uma unidade SATA de nível de consumidor, no entanto, ainda acho que o SQL Server seria capaz de verificar a tabela mais rapidamente do que ~ 100-150 MB/min.

A presença do campo XML faz com que a maioria dos dados da tabela sejam localizados nas páginas LOB_DATA (na verdade, ~90% das páginas da tabela são LOB_DATA).

Acho que minha pergunta é - estou correto ao pensar que as páginas LOB_DATA podem causar verificações lentas não apenas por causa de seu tamanho, mas também porque o SQL Server não pode verificar o índice clusterizado com eficiência quando há muitas páginas LOB_DATA na tabela?

Ainda mais amplamente - é considerado razoável ter tal estrutura de tabela/padrão de dados? As recomendações para usar o Filestream geralmente indicam tamanhos de campo muito maiores, então não quero seguir esse caminho. Eu realmente não encontrei nenhuma boa informação sobre este cenário em particular.

Tenho pensado na compactação XML, mas ela precisa ser feita no cliente ou com SQLCLR e exigiria bastante trabalho para implementar no sistema.

Tentei a compactação e, como os XMLs são altamente redundantes, posso (no aplicativo ac#) compactar o XML de 20 KB para ~ 2,5 KB e armazená-lo na coluna VARBINARY, evitando o uso de páginas de dados LOB. Isso acelera SELECTs 20x vezes em meus testes.

sql-server performance
  • 2 respostas
  • 3367 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