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
8kb
Asked: 2015-07-29 10:03:32 +0800 CST

Por que a variável de tabela está forçando uma varredura de índice enquanto a tabela temporária usa busca e pesquisa de favoritos?

  • 18

Estou tentando entender por que usar uma variável de tabela está impedindo o otimizador de usar uma busca de índice e, em seguida, marcar uma pesquisa em vez de uma varredura de índice.

Preenchendo a tabela:

CREATE TABLE dbo.Test 
(
    RowKey INT NOT NULL PRIMARY KEY, 
    SecondColumn CHAR(1) NOT NULL DEFAULT 'x',
    ForeignKey INT NOT NULL 
) 

INSERT dbo.Test 
(
    RowKey, 
    ForeignKey
) 
SELECT TOP 1000000 
    ROW_NUMBER() OVER (ORDER BY (SELECT 0)),
    ABS(CHECKSUM(NEWID()) % 10)     
FROM sys.all_objects s1
CROSS JOIN sys.all_objects s2 

CREATE INDEX ix_Test_1 ON dbo.Test (ForeignKey) 

Preencha uma variável de tabela com um único registro e tente pesquisar a chave primária e a segunda coluna pesquisando na coluna da chave estrangeira:

DECLARE @Keys TABLE (RowKey INT NOT NULL) 

INSERT @Keys (RowKey) VALUES (10)

SELECT 
    t.RowKey,
    t.SecondColumn
FROM
    dbo.Test t 
INNER JOIN 
    @Keys k
ON
    t.ForeignKey = k.RowKey

Segue abaixo o plano de execução:

insira a descrição da imagem aqui

Agora, a mesma consulta usando uma tabela temporária:

CREATE TABLE #Keys (RowKey INT NOT NULL) 

INSERT #Keys (RowKey) VALUES (10) 

SELECT 
    t.RowKey,
    t.SecondColumn
FROM
    dbo.Test t 
INNER JOIN 
    #Keys k
ON
    t.ForeignKey = k.RowKey

Este plano de consulta usa uma pesquisa de busca e marcador:

insira a descrição da imagem aqui

Por que o otimizador deseja fazer a pesquisa de favoritos com a tabela temporária, mas não com a variável da tabela?

A variável de tabela é usada neste exemplo para representar dados provenientes de um tipo de tabela definido pelo usuário em um procedimento armazenado.

Percebo que a busca de índice pode não ser apropriada se o valor da chave estrangeira ocorrer centenas de milhares de vezes. Nesse caso, uma varredura provavelmente seria uma escolha melhor. Para o cenário que criei, não havia nenhuma linha com valor 10. Ainda acho o comportamento interessante e gostaria de saber se há uma razão para isso.

SQL Fiddle

Adicionar OPTION (RECOMPILE)não alterou o comportamento. O UDDT tem uma chave primária.

@@VERSIONé SQL Server 2008 R2 (SP2) - 10.50.4042.0 (X64) (Build 7601: Service Pack 1) (Hipervisor)

sql-server sql-server-2008-r2
  • 2 respostas
  • 5404 Views
Martin Hope
user2173353
Asked: 2015-07-24 04:06:27 +0800 CST

Melhor maneira de escrever uma consulta SQL que verifica uma coluna para um valor não NULL ou NULL

  • 18

Tenho um SP com um parâmetro que tem NULL como valor padrão e então quero fazer uma consulta assim:

SELECT ...
FROM ...
WHERE a.Blah = @Blah AND (a.VersionId = @VersionId OR (@VersionId IS NULL AND a.VersionId IS NULL));

O WHEREacima verifica um valor não NULL e um valor NULL para @VersionId.

Seria melhor em termos de desempenho usar uma IFinstrução e duplicar a consulta em uma que procura não NULL e outra para NULL assim? :

IF @VersionId IS NULL BEGIN
    SELECT ...
    FROM ...
    WHERE a.Blah = @Blah AND a.VersionId IS NULL;
ELSE BEGIN
    SELECT ...
    FROM ...
    WHERE a.Blah = @Blah AND a.VersionId = @VersionId;
END

Ou o otimizador de consulta torna essencialmente o mesmo?

ATUALIZAR:

(Nota: estou usando o SQL Server)

(E até onde eu sei, usar a.VersionId = @VersionIdpara ambos os casos não vai funcionar, vai?)

sql-server-2008 performance
  • 1 respostas
  • 10386 Views
Martin Hope
Maria Sinding-Olsen
Asked: 2015-07-15 06:38:39 +0800 CST

Converter data yyyy-mm-dd para inteiro YYYYMM

  • 18

Como posso converter @dateb:

SET @dateb = dateadd(month, datediff(month, 0, getdate()) - 3, 0)

que retorna 2014-04-04como data para um inteiro de201404

Obrigado

sql-server
  • 4 respostas
  • 204180 Views
Martin Hope
Mark Freeman
Asked: 2015-07-14 05:37:15 +0800 CST

Como posso converter uma chave em um relatório de impasse do SQL Server para o valor?

  • 18

Tenho um relatório de impasse que me diz que houve um conflito envolvendo

waitresource="KEY: 9:72057632651542528 (543066506c7c)"

e eu posso ver isso:

<keylock hobtid="72057632651542528" dbid="9" objectname="MyDatabase.MySchema.MyTable" indexname="MyPrimaryKeyIndex" id="locka8c6f4100" mode="X" associatedObjectId="72057632651542528">

dentro do <resource-list>elemento.

Quero poder encontrar o valor real da chave (id = 12345, por exemplo). Qual instrução SQL eu precisaria usar para obter essas informações?

sql-server sql-server-2012
  • 4 respostas
  • 13942 Views
Martin Hope
Petr Přikryl
Asked: 2015-06-25 03:11:05 +0800 CST

Evite violação única em transação atômica

  • 18

É possível criar uma transação atômica no PostgreSQL?

Considere que eu tenho uma categoria de tabela com estas linhas:

id|name
--|---------
1 |'tablets'
2 |'phones'

E o nome da coluna tem restrição exclusiva.

Se eu tentar:

BEGIN;
update "category" set name = 'phones' where id = 1;
update "category" set name = 'tablets' where id = 2;
COMMIT;

Estou entendendo:

ERROR:  duplicate key value violates unique constraint "category_name_key"
DETAIL:  Key (name)=(tablets) already exists.
postgresql transaction
  • 2 respostas
  • 9512 Views
Martin Hope
Firoz Tennali
Asked: 2015-05-29 21:16:45 +0800 CST

Como posso fazer backup de tabelas específicas no SQL Server 2008 usando T-SQL Script

  • 18

Eu quero fazer um backup de determinadas tabelas disponíveis no meu banco de dados em um .bakarquivo, e tudo isso deve ser feito usando um script T-SQL.

sql-server sql-server-2008
  • 7 respostas
  • 201251 Views
Martin Hope
user45623
Asked: 2015-05-02 18:17:23 +0800 CST

Entendendo um sistema de notificação

  • 18

Eu tenho pesquisado como construir um sistema de notificação no SE e em outro lugar e me encontrei atraído pela solução que é a resposta aceita aqui: https://stackoverflow.com/questions/9735578/building-a-notification-system que usa esta estrutura:

╔═════════════╗      ╔═══════════════════╗      ╔════════════════════╗
║notification ║      ║notification_object║      ║notification_change ║
╟─────────────╢      ╟───────────────────╢      ╟────────────────────╢
║ID           ║—1:n—→║ID                 ║—1:n—→║ID                  ║
║userID       ║      ║notificationID     ║      ║notificationObjectID║
╚═════════════╝      ║object             ║      ║verb                ║
                     ╚═══════════════════╝      ║actor               ║
                                                ╚════════════════════╝

Uma notificação é sobre algo (objeto = evento, amizade..) sendo alterado (verbo = adicionado, solicitado..) por alguém (ator) e relatado ao usuário (sujeito). Aqui está uma estrutura de dados normalizada (embora eu tenha usado o MongoDB). Você precisa notificar certos usuários sobre as mudanças. Portanto, são notificações por usuário. Isso significa que, se houver 100 usuários envolvidos, você gerará 100 notificações.

A princípio pensei que entendia essa abordagem, mas quando comecei a me preparar para implementá-la, percebi que aparentemente não a entendia muito bem. Os últimos comentários sobre a resposta são perguntas de outros usuários que também tiveram problemas para entender a solução.

Não tenho certeza se esse é o modelo que acabarei seguindo, mas, devido ao número de votos positivos que ele tem, tenho certeza de que me beneficiaria entendê -lo e certamente gostaria de aprender mais. Espero que isso também seja útil para outras pessoas que tiveram problemas para entender essa solução (aliás, não tenho pontos de internet suficientes para deixar um comentário nessa resposta direcionando a essa pergunta, qualquer outra pessoa, por favor, faça!)

Perguntas

Se bem entendi, notificationObjectID é uma chave estrangeira apontando para a tabela notification_object e notificationID é uma chave estrangeira apontando para a tabela de notificação . Parece que o objeto deve ser uma chave estrangeira referindo-se ao ID da entrada do banco de dados sobre a notificação (por exemplo, um evento ou post específico), mas não precisamos de outro campo para indicar a qual tabela esse ID pertence?

O autor escreveu

notification_object.object identifica o tipo de alteração, como uma string "friendship" A referência real ao objeto alterado com seus dados extras sobre os quais falo está em notification_change.notificationObjectID

o que não me parece fazer sentido. Object é uma string (enum?) e notificationObjectID é uma chave estrangeira referente ao objeto de que trata a notificação? Então, como as mesas do meio e da direita estão conectadas?

Parece que a tabela do meio especifica sobre qual objeto (ou tipo de objeto) a notificação é, por exemplo, um evento ou postagem. Podemos então ter muitas entradas em notification_change que apontam para o mesmo tipo de objeto, o que nos permite agrupar notificações (como "25 usuários postados no mural de X) - daí a relação 1:n entre as tabelas do meio e da direita.

Mas por que existe uma relação 1:n entre as mesas da esquerda e do meio? Vamos dar a "25 usuários postados no mural de Sam" e "Mary atualizou seu evento "Friday Picnic" o mesmo ID de notificação? Se todas as notificações para o mesmo usuário têm o mesmo ID de notificação, por que precisamos da tabela no deixei?

Uma pergunta de desempenho - digamos que John poste um comentário sobre o piquenique de Mary. Parece que precisaríamos fazer uma pesquisa para ver se já existe um notification_object para Mary's Picnic antes de criarmos a entrada notification_change . Isso afetará negativamente o desempenho ou não é um problema? Continuando com as perguntas do parágrafo anterior, como saberíamos para qual entrada de notificação apontar o notification_object ?

database-design
  • 1 respostas
  • 16729 Views
Martin Hope
Alex Jolig
Asked: 2015-04-18 05:19:11 +0800 CST

Como atualizar o PostgreSQL da versão 8.4 para 9.4?

  • 18

Eu quero atualizar meu PostgreSQL da versão 8.4 para 9.4 .

A documentação não é muito clara para mim.

  1. Perderei meus bancos de dados antigos se fizer a atualização?
  2. Como posso fazer backup de meus bancos de dados antigos se eu os perder após a atualização?
  3. Como posso atualizar meu psql?

Meu PostgreSQL está rodando em um servidor CentOS 6.6 .

postgresql upgrade
  • 3 respostas
  • 47325 Views
Martin Hope
user24601
Asked: 2014-12-25 08:50:55 +0800 CST

MySQL open_files_limit - não pode alterar esta variável

  • 18

Estou tendo problemas porque meu open_files_limitpara mysql é apenas 1024.

Centos 7, MySQL Community Server 5.6.22-log

Na verdade, é um vps dedicado ao mysql para um servidor WHM (mysql remoto), mas isso não vem ao caso.


Arquivos de configuração

my.cnf:

[mysqld]
open_files_limit = 100000
open-files-limit = 100000 #I've read that the dashes are required on older versions, but I threw it in anyway.
innodb_buffer_pool_size = 600M
...

# and the same for mysqld_safe
[mysqld_safe]
open_files_limit = 100000
open-files-limit = 100000
...

/etc/security/limits.conf:

*       hard    nofile  100000
*       soft    nofile  100000

Saídas de comando

Meu sistema operacional open_files_limit para root:

[root@mack ~]# ulimit -Hn -Sn
open files                      (-n) 100000
open files                      (-n) 100000

E então como usuário mysql:

[root@mack ~]# su mysql
bash-4.2$ ulimit -Hn -Sn
open files                      (-n) 100000
open files                      (-n) 100000

Estado do MySQL:

[root@mack ~]# service mysql status
Redirecting to /bin/systemctl status  mysql.service
mysqld.service - MySQL Community Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled)
   Active: active (running) since Wed 2014-12-24 10:41:09 EST; 40min ago
  Process: 2982 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
  Process: 2970 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 2981 (mysqld_safe)
   CGroup: /system.slice/mysqld.service
           ââ2981 /bin/sh /usr/bin/mysqld_safe
           ââ3268 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --open-files-limit=100000 --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/my...

Dec 24 10:41:08 mack systemd[1]: Starting MySQL Community Server...
Dec 24 10:41:09 mack mysqld_safe[2981]: 141224 10:41:09 mysqld_safe Logging to '/var/log/mysqld.log'.
Dec 24 10:41:09 mack mysqld_safe[2981]: 141224 10:41:09 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
Dec 24 10:41:09 mack systemd[1]: Started MySQL Community Server.

Reiniciei o mysql, parei, verifiquei o status para ter certeza de que parou, iniciei e reiniciei todo o sistema.

Evidências que my.cnffuncionam:

mysql> show global variables like '%buffer_pool_size%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 629145600 |
+-------------------------+-----------+
1 row in set (0.00 sec)

Agora, aqui é onde minha pressão arterial sobe:

mysql> show global variables like 'open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1024  |
+------------------+-------+
1 row in set (0.00 sec)

o que estou perdendo? Existe outro my.cnf que está substituindo meu valor?

[root@mack ~]# find / -name "*.cnf"
/usr/share/mysql/my-default.cnf
/usr/share/doc/mysql-community-server-5.6.22/my-default.cnf
/var/lib/mysql/auto.cnf
/etc/my.cnf
/etc/pki/tls/openssl.cnf

Eu olhei para todos eles e não há menção de open_files_limit. Por acaso, eu passei greppor estes procurando a configuração:

[root@mack ~]# grep -r "open_files_limit" /etc
/etc/my.cnf:open_files_limit = 100000
/etc/my.cnf:open_files_limit = 100000
[root@mack ~]# grep -r "open_files_limit" /var
[root@mack ~]# grep -r "open_files_limit" /usr
/usr/share/vim/vim74/syntax/ora.vim:syn keyword oraKeywordUnd     _number_cached_attributes _offline_rollback_segments _open_files_limit
Binary file /usr/sbin/mysqld matches
Binary file /usr/sbin/mysqld-debug matches
Binary file /usr/bin/mysqlbinlog matches
/usr/bin/mysqld_safe:      --open_files_limit=*) open_files="$val" ;;

Mas não, eles não afetam isso.

mysql
  • 1 respostas
  • 43843 Views
Martin Hope
Heisenberg
Asked: 2014-11-27 02:19:52 +0800 CST

EXCEPT operador vs NOT IN

  • 18

O EXCEPToperador foi introduzido no SQL Server 2005, mas qual é a diferença entre NOT INe EXCEPT?

Faz o mesmo? Gostaria de uma explicação simples com um exemplo.

sql-server sql-server-2008-r2
  • 3 respostas
  • 38902 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