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
Paul White
Asked: 2015-09-08 12:13:41 +0800 CST

Soma contínua do intervalo de datas usando funções de janela

  • 61

Preciso calcular uma soma contínua em um intervalo de datas. Para ilustrar, usando o banco de dados de exemplo AdventureWorks , a seguinte sintaxe hipotética faria exatamente o que eu preciso:

SELECT
    TH.ProductID,
    TH.TransactionDate,
    TH.ActualCost,
    RollingSum45 = SUM(TH.ActualCost) OVER (
        PARTITION BY TH.ProductID
        ORDER BY TH.TransactionDate
        RANGE BETWEEN 
            INTERVAL 45 DAY PRECEDING
            AND CURRENT ROW)
FROM Production.TransactionHistory AS TH
ORDER BY
    TH.ProductID,
    TH.TransactionDate,
    TH.ReferenceOrderID;

Infelizmente, a RANGEextensão do quadro da janela não permite atualmente um intervalo no SQL Server.

Eu sei que posso escrever uma solução usando uma subconsulta e uma agregação regular (não janela):

SELECT 
    TH.ProductID,
    TH.TransactionDate,
    TH.ActualCost,
    RollingSum45 =
    (
        SELECT SUM(TH2.ActualCost)
        FROM Production.TransactionHistory AS TH2
        WHERE
            TH2.ProductID = TH.ProductID
            AND TH2.TransactionDate <= TH.TransactionDate
            AND TH2.TransactionDate >= DATEADD(DAY, -45, TH.TransactionDate)
    )
FROM Production.TransactionHistory AS TH
ORDER BY
    TH.ProductID,
    TH.TransactionDate,
    TH.ReferenceOrderID;

Dado o seguinte índice:

CREATE UNIQUE INDEX i
ON Production.TransactionHistory
    (ProductID, TransactionDate, ReferenceOrderID)
INCLUDE
    (ActualCost);

O plano de execução é:

Plano de execução

Embora não seja terrivelmente ineficiente, parece que deve ser possível expressar essa consulta usando apenas funções analíticas e agregadas de janela com suporte no SQL Server 2012, 2014 ou 2016 (até agora).

Para maior clareza, estou procurando uma solução que execute uma única passagem pelos dados.

Em T-SQL, isso provavelmente significa que a OVERcláusula fará o trabalho e o plano de execução apresentará Spools de Janelas e Agregados de Janelas. Todos os elementos de linguagem que usam a OVERcláusula são um jogo justo. Uma solução SQLCLR é aceitável, desde que seja garantida a produção de resultados corretos.

Para soluções T-SQL, quanto menos Hashes, Classificações e Spools/Agregados de Janelas no plano de execução, melhor. Sinta-se à vontade para adicionar índices, mas estruturas separadas não são permitidas (portanto, nenhuma tabela pré-computada é mantida em sincronia com gatilhos, por exemplo). São permitidas tabelas de referência (tabelas de números, datas, etc.)

Idealmente, as soluções produzirão exatamente os mesmos resultados na mesma ordem que a versão da subconsulta acima, mas qualquer coisa comprovadamente correta também é aceitável. O desempenho é sempre uma consideração, portanto, as soluções devem ser pelo menos razoavelmente eficientes.

Sala de bate-papo dedicada: Criei uma sala de bate-papo pública para discussões relacionadas a esta pergunta e suas respostas. Qualquer usuário com pelo menos 20 pontos de reputação pode participar diretamente. Por favor, ping me em um comentário abaixo se você tem menos de 20 representantes e gostaria de participar.

  • Discussão para "Soma rolante de intervalo de datas usando funções de janela"
sql-server sql-server-2012
  • 6 respostas
  • 62821 Views
Martin Hope
itz_nsn
Asked: 2015-08-06 11:52:31 +0800 CST

Como ORDER BY FIELD() no MySQL funciona internamente

  • 61

Eu entendo como a ORDER BYcláusula funciona e como a FIELD()função funciona. O que eu quero entender é como os dois trabalham juntos para classificar. Como as linhas são recuperadas e como a ordem de classificação é derivada

+----+---------+
| id |  name   |
+----+---------+
|  1 | stan    |
|  2 | kyle    |
|  3 | kenny   |
|  4 | cartman |
+----+---------+ 

SELECT * FROM mytable WHERE id IN (3,2,1,4) ORDER BY FIELD(id,3,2,1,4)

A consulta acima resultará em

+----+---------+
| id |  name   |
+----+---------+
|  3 | kenny   |
|  2 | kyle    |
|  1 | stan    |
|  4 | cartman |
+----+---------+ 

algo semelhante a dizer ORDER BY 3, 2, 1, 4

PERGUNTAS

  • Como isso funciona internamente?
  • Como o MySQL obtém as linhas e calcula a ordem de classificação?
  • Como o MySQL sabe que precisa classificar pela coluna id?
mysql order-by
  • 2 respostas
  • 173154 Views
Martin Hope
Garrett
Asked: 2015-02-06 18:19:41 +0800 CST

Otimizando uma consulta Postgres com um grande IN

  • 61

Essa consulta obtém uma lista de postagens criadas por pessoas que você segue. Você pode seguir um número ilimitado de pessoas, mas a maioria das pessoas segue < 1.000 pessoas.

Com esse estilo de consulta, a otimização óbvia seria armazenar em cache os "Post"ids, mas infelizmente não tenho tempo para isso no momento.

EXPLAIN ANALYZE SELECT
    "Post"."id",
    "Post"."actionId",
    "Post"."commentCount",
    ...
FROM
    "Posts" AS "Post"
INNER JOIN "Users" AS "user" ON "Post"."userId" = "user"."id"
LEFT OUTER JOIN "ActivityLogs" AS "activityLog" ON "Post"."activityLogId" = "activityLog"."id"
LEFT OUTER JOIN "WeightLogs" AS "weightLog" ON "Post"."weightLogId" = "weightLog"."id"
LEFT OUTER JOIN "Workouts" AS "workout" ON "Post"."workoutId" = "workout"."id"
LEFT OUTER JOIN "WorkoutLogs" AS "workoutLog" ON "Post"."workoutLogId" = "workoutLog"."id"
LEFT OUTER JOIN "Workouts" AS "workoutLog.workout" ON "workoutLog"."workoutId" = "workoutLog.workout"."id"
WHERE
"Post"."userId" IN (
    201486,
    1825186,
    998608,
    340844,
    271909,
    308218,
    341986,
    216893,
    1917226,
    ...  -- many more
)
AND "Post"."private" IS NULL
ORDER BY
    "Post"."createdAt" DESC
LIMIT 10;

Rendimentos:

Limit  (cost=3.01..4555.20 rows=10 width=2601) (actual time=7923.011..7973.138 rows=10 loops=1)
  ->  Nested Loop Left Join  (cost=3.01..9019264.02 rows=19813 width=2601) (actual time=7923.010..7973.133 rows=10 loops=1)
        ->  Nested Loop Left Join  (cost=2.58..8935617.96 rows=19813 width=2376) (actual time=7922.995..7973.063 rows=10 loops=1)
              ->  Nested Loop Left Join  (cost=2.15..8821537.89 rows=19813 width=2315) (actual time=7922.984..7961.868 rows=10 loops=1)
                    ->  Nested Loop Left Join  (cost=1.71..8700662.11 rows=19813 width=2090) (actual time=7922.981..7961.846 rows=10 loops=1)
                          ->  Nested Loop Left Join  (cost=1.29..8610743.68 rows=19813 width=2021) (actual time=7922.977..7961.816 rows=10 loops=1)
                                ->  Nested Loop  (cost=0.86..8498351.81 rows=19813 width=1964) (actual time=7922.972..7960.723 rows=10 loops=1)
                                      ->  Index Scan using posts_createdat_public_index on "Posts" "Post"  (cost=0.43..8366309.39 rows=20327 width=261) (actual time=7922.869..7960.509 rows=10 loops=1)
                                            Filter: ("userId" = ANY ('{201486,1825186,998608,340844,271909,308218,341986,216893,1917226, ... many more ...}'::integer[]))
                                            Rows Removed by Filter: 218360
                                      ->  Index Scan using "Users_pkey" on "Users" "user"  (cost=0.43..6.49 rows=1 width=1703) (actual time=0.005..0.006 rows=1 loops=10)
                                            Index Cond: (id = "Post"."userId")
                                ->  Index Scan using "ActivityLogs_pkey" on "ActivityLogs" "activityLog"  (cost=0.43..5.66 rows=1 width=57) (actual time=0.107..0.107 rows=0 loops=10)
                                      Index Cond: ("Post"."activityLogId" = id)
                          ->  Index Scan using "WeightLogs_pkey" on "WeightLogs" "weightLog"  (cost=0.42..4.53 rows=1 width=69) (actual time=0.001..0.001 rows=0 loops=10)
                                Index Cond: ("Post"."weightLogId" = id)
                    ->  Index Scan using "Workouts_pkey" on "Workouts" workout  (cost=0.43..6.09 rows=1 width=225) (actual time=0.001..0.001 rows=0 loops=10)
                          Index Cond: ("Post"."workoutId" = id)
              ->  Index Scan using "WorkoutLogs_pkey" on "WorkoutLogs" "workoutLog"  (cost=0.43..5.75 rows=1 width=61) (actual time=1.118..1.118 rows=0 loops=10)
                    Index Cond: ("Post"."workoutLogId" = id)
        ->  Index Scan using "Workouts_pkey" on "Workouts" "workoutLog.workout"  (cost=0.43..4.21 rows=1 width=225) (actual time=0.004..0.004 rows=0 loops=10)
              Index Cond: ("workoutLog"."workoutId" = id)
Total runtime: 7974.524 ms

Como isso pode ser otimizado por enquanto?

Tenho os seguintes índices relevantes:

-- Gets used
CREATE INDEX  "posts_createdat_public_index" ON "public"."Posts" USING btree("createdAt" DESC) WHERE "private" IS null;
-- Don't get used
CREATE INDEX  "posts_userid_fk_index" ON "public"."Posts" USING btree("userId");
CREATE INDEX  "posts_following_index" ON "public"."Posts" USING btree("userId", "createdAt" DESC) WHERE "private" IS null;

Talvez isso exija um grande índice composto parcial com createdAte userIdonde private IS NULL?

postgresql index
  • 3 respostas
  • 85782 Views
Martin Hope
Nicolas Payart
Asked: 2014-07-31 08:01:55 +0800 CST

Desabilite o log binário do MySQL com a variável log_bin

  • 60

O arquivo de configuração padrão do MySQL /etc/mysql/my.cnf instalado por algum pacote debian usando o APT geralmente define a variável log_bin, então o binlog está habilitado:

log_bin = /var/log/mysql/mysql-bin.log

Quando eu quiser desabilitar o log binário em tal instalação, comente a linha em my.cnf funciona, é claro, mas eu me pergunto se existe uma maneira de desabilitar o log binário configurando explicitamente log_bin para OFF, em um estilo debian, quero dizer em um arquivo incluído como /etc/mysql/conf.d/myCustomFile.cnf, então o padrão my.cnf não é alterado e pode ser facilmente atualizado pelo apt, se necessário.

Eu tentei "log_bin = 0", "log_bin = OFF" ou "log_bin =" mas nenhum funciona...

mysql logs
  • 6 respostas
  • 158423 Views
Martin Hope
ursitesion
Asked: 2013-12-14 03:32:38 +0800 CST

Por que usar WHERE 1 ou WHERE 1=1?

  • 61

Normalmente, se as condições não forem exigidas em nossas instruções de consulta, não usamos uma WHEREcláusula. Mas eu vi uma WHERE 1cláusula sendo usada em muitos lugares, mesmo onde outras condições não estão presentes.

  • Por que isso é feito?
  • Existem benefícios específicos para o tempo de execução?
  • Permite outras funcionalidades?
  • O uso é WHERE 1=1semelhante a isso?
mysql-5.1
  • 6 respostas
  • 217465 Views
Martin Hope
Kshitiz Sharma
Asked: 2013-11-29 19:50:44 +0800 CST

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

  • 60

Tenho uma tabela com 100 colunas. Ao selecionar dados nos SQL Pluswraps de saída, dificultando a leitura.

O que eu gostaria é que uma barra de rolagem horizontal aparecesse ou de alguma forma enviasse a saída paraless

Eu executo as seguintes instruções no SQLPlus -

SET LINESIZE 32000;
SET PAGESIZE 40000;
SET LONG 50000;
SPOOL output.txt
SELECT * FROM big_table;

Então basheu corro -

menos output.txt

A saída ainda aparece embrulhada e ilegível.

oracle sqlplus
  • 3 respostas
  • 576036 Views
Martin Hope
Stephan
Asked: 2013-06-07 01:10:36 +0800 CST

Como executar tarefas recorrentes no Postgresql sem uma ferramenta externa semelhante ao cron?

  • 60

Eu gostaria de chamar um procedimento armazenado em uma base regular. No Oracle, eu criaria um job para isso. Descobri que o Postgresql pode imitar isso bem usando uma ferramenta externa (cron etc) e o PgAgent.

Você conhece alguma alternativa "interna" que não envolva a ferramenta externa?

  • Quero evitar problemas de segurança com a senha armazenada na linha de comando do pgAgent.
  • Quero evitar qualquer configuração adicional do sistema para ocultar a senha ( ~/.pgpass).

Postgresql 8.3
Linux RedHat 64 bits

postgresql jobs
  • 4 respostas
  • 114082 Views
Martin Hope
Juan Velez
Asked: 2013-05-30 10:33:24 +0800 CST

A instrução CASE do SQL Server avalia todas as condições ou sai na primeira condição TRUE?

  • 61

A instrução SQL Server (2008 ou 2012, especificamente) CASEavalia todas as WHENcondições ou sai quando encontra uma WHENcláusula avaliada como verdadeira? Se ele passar por todo o conjunto de condições, isso significa que a última condição avaliada como verdadeira substitui o que a primeira condição avaliada como verdadeira fez? Por exemplo:

SELECT
    CASE
        WHEN 1+1 = 2 THEN'YES'
        WHEN 1+1 = 3 THEN 'NO'
        WHEN 1+1 = 2 THEN 'NO' 
    END

O resultado é "SIM" mesmo que a última condição quando deva fazer com que seja avaliado como "NÃO". Parece que ele sai assim que encontra a primeira condição TRUE. Alguém pode confirmar se é o caso .

sql-server t-sql
  • 4 respostas
  • 119975 Views
Martin Hope
Mikael Eriksson
Asked: 2013-02-04 23:58:37 +0800 CST

O elenco até o momento é sargável, mas é uma boa ideia?

  • 60

No SQL Server 2008, o tipo de dados de data foi adicionado.

A conversão de uma datetimecoluna para dateé sargável e pode usar um índice na datetimecoluna.

select *
from T
where cast(DateTimeCol as date) = '20130101';

A outra opção que você tem é usar um intervalo.

select *
from T
where DateTimeCol >= '20130101' and
      DateTimeCol < '20130102'

Essas consultas são igualmente boas ou uma deve ser preferida à outra?

sql-server
  • 2 respostas
  • 9374 Views
Martin Hope
Martin
Asked: 2011-05-05 01:31:56 +0800 CST

Qual é a diferença entre select count(*) e select count(any_non_null_column)?

  • 62

Parece que me lembro que (no Oracle) há uma diferença entre proferir select count(*) from any_tablee select count(any_non_null_column) from any_table.

Quais são as diferenças entre essas duas declarações, se houver?

oracle aggregate
  • 4 respostas
  • 36883 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