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 / Perguntas / 229559
Accepted
philomathic_life
philomathic_life
Asked: 2019-02-13 14:39:06 +0800 CST2019-02-13 14:39:06 +0800 CST 2019-02-13 14:39:06 +0800 CST

Solução para atribuir valores exclusivos a linhas com distância de colaboração finita

  • 772

Eu tenho uma tabela que pode ser criada e preenchida com o seguinte código:

CREATE TABLE dbo.Example(GroupKey int NOT NULL, RecordKey varchar(12) NOT NULL);
ALTER TABLE dbo.Example
    ADD CONSTRAINT iExample PRIMARY KEY CLUSTERED(GroupKey ASC, RecordKey ASC);
INSERT INTO dbo.Example(GroupKey, RecordKey)
VALUES (1, 'Archimedes'), (1, 'Newton'), (1, 'Euler'), (2, 'Euler'), (2, 'Gauss'),
       (3, 'Gauss'), (3, 'Poincaré'), (4, 'Ramanujan'), (5, 'Neumann'),
       (5, 'Grothendieck'), (6, 'Grothendieck'), (6, 'Tao');

Para todas as linhas que têm uma distância de colaboração finita com base em RecordKeyoutra linha, gostaria de atribuir um valor exclusivo - não me importa como ou qual tipo de dados é o valor exclusivo.

Um conjunto de resultados correto que atende ao que estou pedindo pode ser gerado com a seguinte consulta:

SELECT 1 AS SupergroupKey, GroupKey, RecordKey
FROM dbo.Example
WHERE GroupKey IN(1, 2, 3)
UNION ALL
SELECT 2 AS SupergroupKey, GroupKey, RecordKey
FROM dbo.Example
WHERE GroupKey = 4
UNION ALL
SELECT 3 AS SupergroupKey, GroupKey, RecordKey
FROM dbo.Example
WHERE GroupKey IN(5, 6)
ORDER BY SupergroupKey ASC, GroupKey ASC, RecordKey ASC;

Para ajudar melhor no que estou perguntando, explicarei por que GroupKeyos s 1–3 têm o mesmo SupergroupKey:

  • GroupKey1 contém o RecordKeyEuler que por sua vez está contido em GroupKey2; assim GroupKeys 1 e 2 devem ter o mesmo SupergroupKey.
  • Como Gauss está contido em GroupKeys 2 e 3, eles também devem ter o mesmo SupergroupKey. Isso faz com que GroupKeys 1–3 tenha o mesmo SupergroupKey.
  • Como GroupKeys 1–3 não compartilham nenhum RecordKeys com os s restantes GroupKey, eles são os únicos com SupergroupKeyvalor 1.

Devo acrescentar que a solução precisa ser genérica. A tabela acima e o conjunto de resultados foram apenas um exemplo.

Termo aditivo

Eu removi o requisito de que a solução não fosse iterativa. Embora eu prefira essa solução, acredito que seja uma restrição irracional. Infelizmente, não consigo usar nenhuma solução baseada em CLR; mas se você quiser incluir essa solução, fique à vontade. Eu provavelmente não vou aceitá-lo como uma resposta embora.

O número de linhas na minha tabela real é tão grande quanto 5 milhões, mas há dias em que o número de linhas será "apenas" em torno de dez mil. Em média, há 8 RecordKeys por GroupKeye 4 GroupKeys por RecordKey. Imagino que uma solução terá uma complexidade de tempo exponencial, mas mesmo assim estou interessado em uma solução.

sql-server sql-server-2016
  • 3 3 respostas
  • 554 Views

3 respostas

  • Voted
  1. Michael Green
    2019-03-05T04:13:58+08:002019-03-05T04:13:58+08:00

    Este problema é sobre seguir links entre itens. Isso o coloca no reino dos gráficos e do processamento de gráficos. Especificamente, todo o conjunto de dados forma um gráfico e estamos procurando por componentes desse gráfico. Isso pode ser ilustrado por um gráfico dos dados da amostra da pergunta.

    insira a descrição da imagem aqui

    A pergunta diz que podemos seguir GroupKey ou RecordKey para encontrar outras linhas que compartilham esse valor. Assim, podemos tratar ambos como vértices em um grafo. A questão continua explicando como GroupKeys 1–3 têm a mesma SupergroupKey. Isso pode ser visto como o cluster à esquerda unido por linhas finas. A figura também mostra os outros dois componentes (SupergroupKey) formados pelos dados originais.

    O SQL Server tem alguma capacidade de processamento gráfico incorporada ao T-SQL. No momento, é bastante escasso, no entanto, e não ajuda com esse problema. O SQL Server também tem a capacidade de chamar R e Python e o conjunto rico e robusto de pacotes disponíveis para eles. Um desses é o igraph . Ele foi escrito para "manuseio rápido de grafos grandes, com milhões de vértices e arestas ( link )."

    Usando R e igraph, consegui processar um milhão de linhas em 2 minutos e 22 segundos em testes locais 1 . É assim que se compara com a melhor solução atual:

    Record Keys     Paul White  R               
    ------------    ----------  --------
    Per question    15ms        ~220ms
    100             80ms        ~270ms
    1,000           250ms       430ms
    10,000          1.4s        1.7s
    100,000         14s         14s
    1M              2m29        2m22s
    1M              n/a         1m40    process only, no display
    
    The first column is the number of distinct RecordKey values. The number of rows
    in the table will be 8 x this number.
    

    Ao processar 1 milhão de linhas, 1m40s foram usados ​​para carregar e processar o gráfico e atualizar a tabela. 42s foram necessários para preencher uma tabela de resultados do SSMS com a saída.

    A observação do Gerenciador de Tarefas enquanto 1 milhão de linhas eram processadas sugere que cerca de 3 GB de memória de trabalho foram necessários. Isso estava disponível neste sistema sem paginação.

    Posso confirmar a avaliação de Ypercube da abordagem CTE recursiva. Com algumas centenas de chaves de registro, consumia 100% da CPU e toda a RAM disponível. Eventualmente, o tempdb cresceu para mais de 80 GB e o SPID travou.

    Eu usei a tabela de Paul com a coluna SupergroupKey para que haja uma comparação justa entre as soluções.

    Por alguma razão R se opôs ao acento em Poincaré. Alterá-lo para um "e" simples permitiu que ele fosse executado. Eu não investiguei, pois não é pertinente ao problema em questão. Tenho certeza que há uma solução.

    Aqui está o código

    -- This captures the output from R so the base table can be updated.
    drop table if exists #Results;
    
    create table #Results
    (
        Component   int         not NULL,
        Vertex      varchar(12) not NULL primary key
    );
    
    
    truncate table #Results;    -- facilitates re-execution
    
    declare @Start time = sysdatetimeoffset();  -- for a 'total elapsed' calculation.
    
    insert #Results(Component, Vertex)
    exec sp_execute_external_script   
        @language = N'R',
        @input_data_1 = N'select GroupKey, RecordKey from dbo.Example',
        @script = N'
    library(igraph)
    df.g <- graph.data.frame(d = InputDataSet, directed = FALSE)
    cpts <- components(df.g, mode = c("weak"))
    OutputDataSet <- data.frame(cpts$membership)
    OutputDataSet$VertexName <- V(df.g)$name
    ';
    
    -- Write SuperGroupKey to the base table, as other solutions do
    update e
    set
        SupergroupKey = r.Component
    from dbo.Example as e
    inner join #Results as r
        on r.Vertex = e.RecordKey;
    
    -- Return all rows, as other solutions do
    select
        e.SupergroupKey,
        e.GroupKey,
        e.RecordKey
    from dbo.Example as e;
    
    -- Calculate the elapsed
    declare @End time = sysdatetimeoffset();
    select Elapse_ms = DATEDIFF(MILLISECOND, @Start, @End);
    
    

    Isso é o que o código R faz

    • @input_data_1é como o SQL Server transfere dados de uma tabela para o código R e os converte em um dataframe R chamado InputDataSet.

    • library(igraph)importa a biblioteca para o ambiente de execução do R.

    • df.g <- graph.data.frame(d = InputDataSet, directed = FALSE)carregar os dados em um objeto igraph. Este é um gráfico não direcionado, pois podemos seguir links de grupo para registro ou registro para grupo. InputDataSet é o nome padrão do SQL Server para o conjunto de dados enviado para R.

    • cpts <- components(df.g, mode = c("weak"))processe o gráfico para encontrar subgráficos discretos (componentes) e outras medidas.

    • OutputDataSet <- data.frame(cpts$membership) SQL Server expects a data frame back from R. Its default name is OutputDataSet. The components are stored in a vector called "membership". This statement translates the vector to a data frame.

    • OutputDataSet$VertexName <- V(df.g)$name V() is a vector of vertices in the graph - a list of GroupKeys and RecordKeys. This copies them into the ouput data frame, creating a new column called VertexName. This is the key used to match to the source table for updating SupergroupKey.

    I'm not an R expert. Likely this could be optimised.

    Test Data

    The OP's data was used for validation. For scale tests I used the following script.

    drop table if exists Records;
    drop table if exists Groups;
    
    create table Groups(GroupKey int NOT NULL primary key);
    create table Records(RecordKey varchar(12) NOT NULL primary key);
    go
    
    set nocount on;
    
    -- Set @RecordCount to the number of distinct RecordKey values desired.
    -- The number of rows in dbo.Example will be 8 * @RecordCount.
    declare @RecordCount    int             = 1000000;
    
    -- @Multiplier was determined by experiment.
    -- It gives the OP's "8 RecordKeys per GroupKey and 4 GroupKeys per RecordKey"
    -- and allows for clashes of the chosen random values.
    declare @Multiplier     numeric(4, 2)   = 2.7;
    
    -- The number of groups required to reproduce the OP's distribution.
    declare @GroupCount     int             = FLOOR(@RecordCount * @Multiplier);
    
    
    -- This is a poor man's numbers table.
    insert Groups(GroupKey)
    select top(@GroupCount)
        ROW_NUMBER() over (order by (select NULL))
    from sys.objects as a
    cross join sys.objects as b
    --cross join sys.objects as c  -- include if needed
    
    
    declare @c int = 0
    while @c < @RecordCount
    begin
        -- Can't use a set-based method since RAND() gives the same value for all rows.
        -- There are better ways to do this, but it works well enough.
        -- RecordKeys will be 10 letters, a-z.
        insert Records(RecordKey)
        select
            CHAR(97 + (26*RAND())) +
            CHAR(97 + (26*RAND())) +
            CHAR(97 + (26*RAND())) +
            CHAR(97 + (26*RAND())) +
            CHAR(97 + (26*RAND())) +
            CHAR(97 + (26*RAND())) +
            CHAR(97 + (26*RAND())) +
            CHAR(97 + (26*RAND())) +
            CHAR(97 + (26*RAND())) +
            CHAR(97 + (26*RAND()));
    
        set @c += 1;
    end
    
    
    -- Process each RecordKey in alphabetical order.
    -- For each choose 8 GroupKeys to pair with it.
    declare @RecordKey varchar(12) = '';
    declare @Groups table (GroupKey int not null);
    
    truncate table dbo.Example;
    
    select top(1) @RecordKey = RecordKey 
    from Records 
    where RecordKey > @RecordKey 
    order by RecordKey;
    
    while @@ROWCOUNT > 0
    begin
        print @Recordkey;
    
        delete @Groups;
    
        insert @Groups(GroupKey)
        select distinct C
        from
        (
            -- Hard-code * from OP's statistics
            select FLOOR(RAND() * @GroupCount)
            union all
            select FLOOR(RAND() * @GroupCount)
            union all
            select FLOOR(RAND() * @GroupCount)
            union all
            select FLOOR(RAND() * @GroupCount)
            union all
            select FLOOR(RAND() * @GroupCount)
            union all
            select FLOOR(RAND() * @GroupCount)
            union all
            select FLOOR(RAND() * @GroupCount)
            union all
            select FLOOR(RAND() * @GroupCount)
        ) as T(C);
    
        insert dbo.Example(GroupKey, RecordKey)
        select
            GroupKey, @RecordKey
        from @Groups;
    
        select top(1) @RecordKey = RecordKey 
        from Records 
        where RecordKey > @RecordKey 
        order by RecordKey;
    end
    
    -- Rebuild the indexes to have a consistent environment
    alter index iExample on dbo.Example rebuild partition = all 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
          ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
    
    
    -- Check what we ended up with:
    select COUNT(*) from dbo.Example;  -- Should be @RecordCount * 8
                                       -- Often a little less due to random clashes
    select 
        ByGroup = AVG(C)
    from
    (
        select CONVERT(float, COUNT(1) over(partition by GroupKey)) 
        from dbo.Example
    ) as T(C);
    
    select
        ByRecord = AVG(C)
    from
    (
        select CONVERT(float, COUNT(1) over(partition by RecordKey)) 
        from dbo.Example
    ) as T(C);
    
    

    I've just now realised I've gotten the ratios the wrong way around from the OP's definition. I don't believe this will affect the timings. Records & Groups are symmetrical to this process. To the algorithm they're all just nodes in a graph.

    In testing the data invariably formed a single component. I believe this is due to the uniform distribution of the data. If instead of the static 1:8 ratio hard-coded into the generation routine I had allowed the ratio to vary there would more likely have been further components.



    1 Especificação da máquina: Microsoft SQL Server 2017 (RTM-CU12), Developer Edition (64 bits), Windows 10 Home. 16 GB de RAM, SSD, i7 hyperthreaded de 4 núcleos, nominal de 2,8 GHz. Os testes eram os únicos itens em execução no momento, além da atividade normal do sistema (cerca de 4% da CPU).

    • 10
  2. Best Answer
    Paul White
    2019-02-13T22:05:14+08:002019-02-13T22:05:14+08:00

    Esta é uma solução T-SQL iterativa para comparação de desempenho.

    Ele assume que uma coluna extra pode ser adicionada à tabela para armazenar a chave do supergrupo e a indexação pode ser alterada:

    Configurar

    DROP TABLE IF EXISTS 
        dbo.Example;
    
    CREATE TABLE dbo.Example
    (
        SupergroupKey integer NOT NULL
            DEFAULT 0, 
        GroupKey integer NOT NULL, 
        RecordKey varchar(12) NOT NULL,
    
        CONSTRAINT iExample 
        PRIMARY KEY CLUSTERED 
            (GroupKey ASC, RecordKey ASC),
    
        CONSTRAINT [IX dbo.Example RecordKey, GroupKey]
        UNIQUE NONCLUSTERED (RecordKey, GroupKey),
    
        INDEX [IX dbo.Example SupergroupKey, GroupKey]
            (SupergroupKey ASC, GroupKey ASC)
    );
    
    INSERT dbo.Example
        (GroupKey, RecordKey)
    VALUES 
        (1, 'Archimedes'), 
        (1, 'Newton'),
        (1, 'Euler'),
        (2, 'Euler'),
        (2, 'Gauss'),
        (3, 'Gauss'),
        (3, 'Poincaré'),
        (4, 'Ramanujan'),
        (5, 'Neumann'),
        (5, 'Grothendieck'),
        (6, 'Grothendieck'),
        (6, 'Tao');
    

    Se você conseguir reverter a ordem da chave primária atual, o índice exclusivo extra não será necessário.

    Contorno

    A abordagem desta solução é:

    1. Defina o ID do supergrupo como 1
    2. Encontre a chave de grupo não processada de menor número
    3. Se nenhum for encontrado, saia
    4. Defina o supergrupo para todas as linhas com a chave de grupo atual
    5. Defina o supergrupo para todas as linhas relacionadas às linhas do grupo atual
    6. Repita a etapa 5 até que nenhuma linha seja atualizada
    7. Incrementar o ID do supergrupo atual
    8. Vá para o passo 2

    Implementação

    Comentários em linha:

    -- No execution plans or rows affected messages
    SET NOCOUNT ON;
    SET STATISTICS XML OFF;
    
    -- Reset all supergroups
    UPDATE E
    SET SupergroupKey = 0
    FROM dbo.Example AS E
        WITH (TABLOCKX)
    WHERE 
        SupergroupKey != 0;
    
    DECLARE 
        @CurrentSupergroup integer = 0,
        @CurrentGroup integer = 0;
    
    WHILE 1 = 1
    BEGIN
        -- Next super group
        SET @CurrentSupergroup += 1;
    
        -- Find the lowest unprocessed group key
        SELECT 
            @CurrentGroup = MIN(E.GroupKey)
        FROM dbo.Example AS E
        WHERE 
            E.SupergroupKey = 0;
    
        -- Exit when no more unprocessed groups
        IF @CurrentGroup IS NULL BREAK;
    
        -- Set super group for all records in the current group
        UPDATE E
        SET E.SupergroupKey = @CurrentSupergroup
        FROM dbo.Example AS E 
        WHERE 
            E.GroupKey = @CurrentGroup;
    
        -- Iteratively find all groups for the super group
        WHILE 1 = 1
        BEGIN
            WITH 
                RecordKeys AS
                (
                    SELECT DISTINCT
                        E.RecordKey
                    FROM dbo.Example AS E
                    WHERE
                        E.SupergroupKey = @CurrentSupergroup
                ),
                GroupKeys AS
                (
                    SELECT DISTINCT
                        E.GroupKey
                    FROM RecordKeys AS RK
                    JOIN dbo.Example AS E
                        WITH (FORCESEEK)
                        ON E.RecordKey = RK.RecordKey
                )
            UPDATE E WITH (TABLOCKX)
            SET SupergroupKey = @CurrentSupergroup
            FROM GroupKeys AS GK
            JOIN dbo.Example AS E
                ON E.GroupKey = GK.GroupKey
            WHERE
                E.SupergroupKey = 0
            OPTION (RECOMPILE, QUERYTRACEON 9481); -- The original CE does better
    
            -- Break when no more related groups found
            IF @@ROWCOUNT = 0 BREAK;
        END;
    END;
    
    SELECT
        E.SupergroupKey,
        E.GroupKey,
        E.RecordKey
    FROM dbo.Example AS E;
    

    Plano de execução

    Para a atualização da chave:

    Atualizar plano

    Resultado

    O estado final da tabela é:

    ╔═══════════════╦══════════╦══════════════╗
    ║ SupergroupKey ║ GroupKey ║  RecordKey   ║
    ╠═══════════════╬══════════╬══════════════╣
    ║             1 ║        1 ║ Archimedes   ║
    ║             1 ║        1 ║ Euler        ║
    ║             1 ║        1 ║ Newton       ║
    ║             1 ║        2 ║ Euler        ║
    ║             1 ║        2 ║ Gauss        ║
    ║             1 ║        3 ║ Gauss        ║
    ║             1 ║        3 ║ Poincaré     ║
    ║             2 ║        4 ║ Ramanujan    ║
    ║             3 ║        5 ║ Grothendieck ║
    ║             3 ║        5 ║ Neumann      ║
    ║             3 ║        6 ║ Grothendieck ║
    ║             3 ║        6 ║ Tao          ║
    ╚═══════════════╩══════════╩══════════════╝
    

    Demonstração: db<>fiddle

    Testes de performance

    Usando o conjunto de dados de teste expandido fornecido na resposta de Michael Green , os horários no meu laptop * são:

    ╔═════════════╦════════╗
    ║ Record Keys ║  Time  ║
    ╠═════════════╬════════╣
    ║ 10k         ║ 2s     ║
    ║ 100k        ║ 12s    ║
    ║ 1M          ║ 2m 30s ║
    ╚═════════════╩════════╝
    

    * Microsoft SQL Server 2017 (RTM-CU13), Developer Edition (64 bits), Windows 10 Pro, 16 GB de RAM, SSD, i7 hyperthread de 4 núcleos, 2,4 GHz nominal.

    • 7
  3. ypercubeᵀᴹ
    2019-02-14T02:11:48+08:002019-02-14T02:11:48+08:00

    Um método CTE recursivo - que provavelmente será terrivelmente ineficiente em tabelas grandes:

    WITH rCTE AS 
    (
        -- Anchor
        SELECT 
            GroupKey, RecordKey, 
            CAST('|' + CAST(GroupKey AS VARCHAR(10)) + '|' AS VARCHAR(100)) AS GroupKeys,
            CAST('|' + CAST(RecordKey AS VARCHAR(10)) + '|' AS VARCHAR(100)) AS RecordKeys,
            1 AS lvl
        FROM Example
    
        UNION ALL
    
        -- Recursive
        SELECT
            e.GroupKey, e.RecordKey, 
            CASE WHEN r.GroupKeys NOT LIKE '%|' + CAST(e.GroupKey AS VARCHAR(10)) + '|%'
                THEN CAST(r.GroupKeys + CAST(e.GroupKey AS VARCHAR(10)) + '|' AS VARCHAR(100))
                ELSE r.GroupKeys
            END,
            CASE WHEN r.RecordKeys NOT LIKE '%|' + CAST(e.RecordKey AS VARCHAR(10)) + '|%'
                THEN CAST(r.RecordKeys + CAST(e.RecordKey AS VARCHAR(10)) + '|' AS VARCHAR(100))
                ELSE r.RecordKeys
            END,
            r.lvl + 1
        FROM rCTE AS r
             JOIN Example AS e
             ON  e.RecordKey = r.RecordKey
             AND r.GroupKeys NOT LIKE '%|' + CAST(e.GroupKey AS VARCHAR(10)) + '|%'
             -- 
             OR e.GroupKey = r.GroupKey
             AND r.RecordKeys NOT LIKE '%|' + CAST(e.RecordKey AS VARCHAR(10)) + '|%'
    )
    SELECT 
        ROW_NUMBER() OVER (ORDER BY GroupKeys) AS SuperGroupKey,
        GroupKeys, RecordKeys
    FROM rCTE AS c
    WHERE NOT EXISTS
          ( SELECT 1
            FROM rCTE AS m
            WHERE m.lvl > c.lvl
              AND m.GroupKeys LIKE '%|' + CAST(c.GroupKey AS VARCHAR(10)) + '|%'
            OR    m.lvl = c.lvl
              AND ( m.GroupKey > c.GroupKey
                 OR m.GroupKey = c.GroupKey
                 AND m.RecordKeys > c.RecordKeys
                  )
              AND m.GroupKeys LIKE '%|' + CAST(c.GroupKey AS VARCHAR(10)) + '|%'
              AND c.GroupKeys LIKE '%|' + CAST(m.GroupKey AS VARCHAR(10)) + '|%'
          ) 
    OPTION (MAXRECURSION 0) ;
    

    Testado em dbfiddle.uk

    • 6

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

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