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 / 53483
Accepted
James Lupolt
James Lupolt
Asked: 2013-11-19 06:03:35 +0800 CST2013-11-19 06:03:35 +0800 CST 2013-11-19 06:03:35 +0800 CST

Sugerir um melhor padrão de design para pesquisas de DNS reverso

  • 772

Estou trabalhando em um projeto em que preciso procurar os nomes de host associados aos endereços IP que foram registrados fazendo solicitações HTTP. Atualmente, as pesquisas acontecem como parte de um trabalho ETL diário. O método atual é usar uma função CLR escalar (código semelhante a este é postado em vários lugares na web, postado abaixo com minhas revisões; não tenho certeza de quem era o autor original):

using System.Data.SqlTypes;
using System.Net;
using System.Security;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

public partial class udfn_GetHostName
{

[Microsoft.SqlServer.Server.SqlFunction]
public static string udfn_GetHostname(string IPAddr)
{
    try
    {
        /* 
         Using deprecated method intentionally.
         GetHostEntry() is now recommended.
         But it does some irritating things like returning an error if a PTR
         record points to a name that doesn't have an A record.
        */
        IPHostEntry IpEntry = Dns.GetHostByAddress(IPAddr);
        // Test whether the record returned has at least one alphabetic character
        // If it does, then it's a name
        // Otherwise the DNS server might have returned the IP address
        Match match = Regex.Match(IpEntry.HostName.ToString(), @"[a-zA-Z]+");

        if (match.Success)
        {
            return IpEntry.HostName.ToString();
        }
        else
        {
            return "None";
        }      

     }
    catch(Exception ex)
    {
        return "Failed";
        //return ex.Message.ToString();
    }
  }
} 

Não sou um desenvolvedor C#, então a qualidade do código CLR provavelmente não é boa.

Então eu chamo a função assim depois de carregar novas linhas na dimensão:

-- Update only rows that we just inserted
UPDATE DIM.Network_Addresses
SET reverse_dns = dbo.[udfn_GetHostname](client_ip) 
WHERE reverse_dns IS NULL 
AND is_current = 1
AND created_date = (SELECT MAX(created_date) FROM DIM.API_Network_Address);

Esse método funciona, mas é muito lento, pelo menos por alguns motivos.

1) O uso de uma função escalar faz com que o SQL Server chame a função CLR uma vez por linha que precisa ser atualizada, usando um novo contexto SQL.

2) As próprias chamadas de função são muito lentas devido à forma como GetHostname() e outras funções de resolução de nome CLR funcionam: tempos limite longos, às vezes várias viagens de ida e volta pela rede que atingem o tempo limite se um servidor DNS não responder ou não houver PTR registro, etc

Alguém poderia recomendar um padrão de design que melhorasse o desempenho da pesquisa de registros DNS reversos e da atualização da tabela?

Estou considerando algumas coisas diferentes:

1) Mova este trabalho para fora do banco de dados e use uma ferramenta como dig para fazer as pesquisas em paralelo.

2) Tente encontrar uma maneira de chamar a função em paralelo ou convertê-la em uma função in-line (não progredindo muito nisso!)

No entanto, qualquer ideia seria bem-vinda.

sql-server sql-server-2008-r2
  • 1 1 respostas
  • 1033 Views

1 respostas

  • Voted
  1. Best Answer
    Remus Rusanu
    2013-11-19T07:26:55+08:002013-11-19T07:26:55+08:00

    Não faça isso em SQL. Das poucas coisas que podem ser categorizadas como 'uso estúpido de SQLCLR', fazer chamadas de rede longas e caras está em primeiro lugar. No mínimo, certifique-se de que o código CLR chama Thread.BeginThreadAffinity()antes de aguardar a resposta do intertubez (pesquisa DNS e pesquisa reversa incluídas).

    A maneira correta de lidar com isso é usar um processo externo, colocar os IPs para resolver em uma fila , desenfileirar em lotes e resolver vários (dezenas) de IPs em paralelo usando I/O assíncrono, por exemplo. o não obsoleto Dns.BeginGetHostEntry().

    • 8

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

    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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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