performance
515 TopicsDataEX Bootcamp: Data Women Engineers 2025
DataEX Bootcamp Data Women Engineers 2025: Uma Oportunidade Imperdível para Mulheres que Querem Iniciar na Carreira de Engenharia de Dados Se você é uma mulher apaixonada por tecnologia e busca uma oportunidade para se aprofundar em Data Engineering, o DataEX Bootcamp Data Women Engineers 2025 pode ser o seu ponto de partida. Este programa exclusivo e gratuito foi desenvolvido para capacitar mulheres que desejam ingressar na área de dados, com um foco prático e realista, visando proporcionar uma imersão completa nas habilidades e ferramentas mais requisitadas pelas empresas de tecnologia. O que é o DataEX Bootcamp Data Women Engineers? O DataEX Bootcamp é um programa de capacitação totalmente gratuito que oferece 50 vagas para mulheres cisgêneras e transgêneras com interesse em aprender sobre engenharia de dados. Durante o bootcamp, as participantes terão acesso a aulas teóricas e práticas, onde serão treinadas para atuar na criação e manipulação de grandes volumes de dados, utilizando ferramentas e tecnologias de ponta como SQL Server, Microsoft Fabric, Python, e muito mais. O curso foi projetado para atender a uma demanda crescente por profissionais qualificados em Data Engineering, uma das áreas mais promissoras da tecnologia. As alunas terão a oportunidade de trabalhar com cenários reais, desenvolvendo habilidades essenciais para o mercado de trabalho. Conteúdo Programático O bootcamp vai além das aulas tradicionais. Ele foca no desenvolvimento de competências técnicas essenciais para o trabalho com engenharia de dados. Durante o curso, você aprenderá: Criação e gerenciamento de Data Warehouses e DataMarts; Processamento de dados com tecnologias avançadas; Segurança e otimização de dados em ambientes corporativos; Monitoramento de dados em tempo real; Uso do Microsoft Fabric para análise e manipulação de dados; Fundamentos de Python aplicados ao trabalho com dados. O programa combina teoria e prática, permitindo que as participantes desenvolvam seus próprios projetos e desafios, como seria o caso em um ambiente corporativo. Isso garante que as habilidades adquiridas sejam imediatamente aplicáveis no mercado de trabalho. Etapas do Processo Seletivo O processo seletivo para o DataEX Bootcamp Data Women Engineers 2025 é simples, mas exige comprometimento e dedicação. As etapas são: Inscrição Online: Você deve acessar a página do bootcamp e preencher o formulário de inscrição até o dia 31 de dezembro de 2024. É importante completar todos os campos corretamente para garantir sua candidatura. Desafio Cloud Skills: Após a inscrição, será necessário realizar o Desafio Cloud Skills. Este desafio é um teste introdutório que ajuda a avaliar seu nível de conhecimento e familiaridade com conceitos básicos de cloud computing. A conclusão deste desafio deve ser confirmada até o dia 07 de janeiro de 2025. Seleção: As participantes que cumprirem todas as etapas com sucesso receberão um e-mail de confirmação até 21 de janeiro de 2025. O bootcamp começa em 03 de fevereiro de 2025. Agenda e Modalidade O bootcamp terá aulas de 03 de fevereiro a 14 de fevereiro de 2025, com encontros programados de segunda a sexta-feira, das 13h30 às 17h30. As participantes terão que se comprometer a comparecer a todas as aulas, que ocorrerão de forma 100% online. Durante esse período, será possível aprender em tempo real e tirar dúvidas diretamente com os instrutores. Certificação e Desafio Final Ao final do bootcamp, todas as alunas que completarem o programa com sucesso receberão um certificado de participação, confirmando suas novas habilidades adquiridas. Além disso, todas as participantes serão desafiadas a realizar o Desafio Data Engineer, um teste prático que avaliará seus conhecimentos e habilidades adquiridos ao longo das aulas. O desafio ocorrerá entre 14 e 23 de fevereiro de 2025. Requisitos para Participação Para ser selecionada, você precisa atender aos seguintes critérios: Identificar-se como mulher cis ou trans; Ter mais de 18 anos; Ensino Médio completo; Disponibilidade para participar de todas as aulas durante o período de 03 a 14 de fevereiro de 2025 (exceto 08 e 09 de fevereiro, que são dias de descanso); Acesso a um computador ou notebook com conexão à internet; Interesse em trabalhar no mercado de tecnologia. Por que Participar? Este bootcamp é uma excelente oportunidade para mulheres que buscam entrar no mercado de tecnologia, especialmente em um campo de alta demanda como a engenharia de dados. Ao final do programa, as participantes estarão preparadas para enfrentar os desafios do mercado e poderão se destacar em processos seletivos de grandes empresas. Além disso, o bootcamp proporciona um ambiente de aprendizado colaborativo, onde as alunas terão a oportunidade de interagir com outras mulheres que compartilham os mesmos interesses, criando uma rede de apoio importante para o futuro profissional de cada uma. Como Se Inscrever? A inscrição para o DataEX Bootcamp Data Women Engineers 2025 pode ser feita diretamente na página oficial do programa: DataEX Bootcamp. Lembre-se de que as inscrições vão até o dia 31 de dezembro de 2024 e as vagas são limitadas, então não perca tempo! Dúvidas? Se você tem alguma dúvida ou precisa de mais informações, não hesite em entrar em contato com a equipe organizadora através do e-mail treinamentos@dataex.com.br. A equipe estará disponível para esclarecer todas as suas perguntas.4.8KViews1like3CommentsBuilding a Restaurant Management System with Azure Database for MySQL
In this hands-on tutorial, we'll build a Restaurant Management System using Azure Database for MySQL. This project is perfect for beginners looking to understand cloud databases while creating something practical.405Views5likes2CommentsOpen all tabs from previous session but load only last used one
I'm used to work with a lot of tabs organized in several groups and I don't want to lose such tabs when I close and then reopen Edge. This is achievable through settings and I've no complains over it. However, when I open Edge, I expect only the last used tab to load, or at most the tabs from the last group I was using. It is absurd that all the 50+ tabs, splitted in 10+ groups, are loaded all at once, making the startup process very slow. I come from Firefox, where all the tabs from the previous session appears, but only the last used one actually loads. The other ones are loaded only once the user browse on them. The very existence of groups assumes an user is expected to keep a lot of tabs open but to work only with a very small subset of them at a given time. So it's absurd to waste resources, increase power consumption and reduce startup performances by loading all the tabs from the last session, even if most of them will probably not be used.53Views1like2CommentsEffectively troubleshoot latency in SQL Server Transactional replication: Part 1
Are you struggling with latency issues in SQL Server Transactional replication? This article provides clear, step-by-step instructions to effectively troubleshoot and resolve these challenges. Dive into proven techniques and best practices that will help you enhance your SQL Server's performance and ensure seamless data replication. Don't let latency slow you down—master the art of SQL Server troubleshooting today! I hope you find this teaser engaging! If you need any adjustments or additional content, feel free to let me know. Thanks to Collin Benkler, Senior Escalation Engineer in Microsoft for SQL Server for his valuable feedbacks.4.7KViews4likes4CommentsLesson Learned #514: Optimizing Bulk Insert Performance in Parallel Data Ingestion - Part1
While working on a support case, we encountered an issue where bulk inserts were taking longer than our customer’s SLA allowed. Working on the troubleshooting scenario, we identified three main factors affecting performance: High Transaction Log (TLOG) Threshold: The transaction log was under significant pressure, impacting bulk insert speeds. Excessive Indexes: The table had multiple indexes, adding overhead during each insert. High Index Fragmentation: Index fragmentation was high, further slowing down data ingestion. We found that the customer was using partitioning within a single table, and we began considering a restructuring approach that would partition data across multiple databases rather than within a single table. This approach provided several advantages: Set individual Transaction LOG thresholds for each partition, reducing the log pressure. Disable indexes before each insert and rebuild them afterward. In a single table with partitioning, it is currently not possible to disable indexes per partition individually. Select specific Service Level Objectives (SLOs) for each database, optimizing resource allocation based on volume and SLA requirements. Indexed Views for Real-Time Data Retrieval: Partitioned databases allowed us to create indexed views that updated simultaneously with data inserts more faster because the volumen is less, enhancing read performance and consistency. Reduced Fragmentation and Improved Query Performance: By rebuilding indexes after each bulk insert, we maintained optimal index structure across all partitions, significantly improving read speeds and taking less time. By implementing these changes, we were able to achieve a significant reduction in bulk insert times, helping our customer meet SLA targets. Following, I would like to share the following code: This code reads CSV files from a specified folder and performs a parallel bulk inserts per each file.Each CSV file has a header, and the data is separated by the | character. During the reading process, the code identifies the value in column 20, which is a date in the format YYYY-MM-DD. This date value is converted to the YYYY-MM format, which is used to determine the target database where the data should be inserted.For example, if the value in column20 is 2023-08-15, it extracts 2023-08 and directs the record to the corresponding database for that period, for example, db202308. Once the batchsize is reached per partition (rows per YYYY-MM read in the CSV file), the application executes in parallel the SQLBulkCopy. using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.IO; using System.Runtime.Remoting.Contexts; using System.Threading; using System.Threading.Tasks; using Microsoft.Data.SqlClient; namespace BulkInsert { class Program { static string sqlConnectionStringTemplate = "Server=servername.database.windows.net;Database={0};Authentication=Active Directory Managed Identity;User Id=xxxx;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Pooling=true;Max Pool size=300;Min Pool Size=100;ConnectRetryCount=3;ConnectRetryInterval=10;Connection Lifetime=0;Application Name=ConnTest Check Jump;Packet Size=32767"; static string localDirectory = @"C:\CsvFiles"; static int batchSize = 1248000; static SemaphoreSlim semaphore = new SemaphoreSlim(10); static async Task Main(string[] args) { var files = Directory.GetFiles(localDirectory, "*.csv"); Stopwatch totalStopwatch = Stopwatch.StartNew(); foreach (var filePath in files) { Console.WriteLine($"Processing file: {filePath}"); await LoadDataFromCsv(filePath); } totalStopwatch.Stop(); Console.WriteLine($"Total processing finished in {totalStopwatch.Elapsed.TotalSeconds} seconds."); } static async Task LoadDataFromCsv(string filePath) { Stopwatch fileReadStopwatch = Stopwatch.StartNew(); var dataTables = new Dictionary<string, DataTable>(); var bulkCopyTasks = new List<Task>(); using (StreamReader reader = new StreamReader(filePath, System.Text.Encoding.UTF8, true, 819200)) { string line; string key; long lineCount = 0; long lShow = batchSize / 2; reader.ReadLine(); fileReadStopwatch.Stop(); Console.WriteLine($"File read initialization took {fileReadStopwatch.Elapsed.TotalSeconds} seconds."); Stopwatch processStopwatch = Stopwatch.StartNew(); string[] values = new string[31]; while (!reader.EndOfStream) { line = await reader.ReadLineAsync(); lineCount++; if(lineCount % lShow == 0 ) { Console.WriteLine($"Read {lineCount}"); } values = line.Split('|'); key = DateTime.Parse(values[19]).ToString("yyyyMM"); if (!dataTables.ContainsKey(key)) { dataTables[key] = CreateTableSchema(); } var batchTable = dataTables[key]; DataRow row = batchTable.NewRow(); for (int i = 0; i < 31; i++) { row[i] = ParseValue(values[i], batchTable.Columns[i].DataType,i); } batchTable.Rows.Add(row); if (batchTable.Rows.Count >= batchSize) { Console.WriteLine($"BatchSize processing {key} - {batchTable.Rows.Count}."); Stopwatch insertStopwatch = Stopwatch.StartNew(); bulkCopyTasks.Add(ProcessBatchAsync(dataTables[key], key, insertStopwatch)); dataTables[key] = CreateTableSchema(); } } processStopwatch.Stop(); Console.WriteLine($"File read and processing of {lineCount} lines completed in {processStopwatch.Elapsed.TotalSeconds} seconds."); } foreach (var key in dataTables.Keys) { if (dataTables[key].Rows.Count > 0) { Stopwatch insertStopwatch = Stopwatch.StartNew(); bulkCopyTasks.Add(ProcessBatchAsync(dataTables[key], key, insertStopwatch)); } } await Task.WhenAll(bulkCopyTasks); } static async Task ProcessBatchAsync(DataTable batchTable, string yearMonth, Stopwatch insertStopwatch) { await semaphore.WaitAsync(); try { using (SqlConnection conn = new SqlConnection(string.Format(sqlConnectionStringTemplate, $"db{yearMonth}"))) { await conn.OpenAsync(); using (SqlTransaction transaction = conn.BeginTransaction()) using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction) { DestinationTableName = "dbo.dummyTable", BulkCopyTimeout = 40000, BatchSize = batchSize, EnableStreaming = true }) { await bulkCopy.WriteToServerAsync(batchTable); transaction.Commit(); } } insertStopwatch.Stop(); Console.WriteLine($"Inserted batch of {batchTable.Rows.Count} rows to db{yearMonth} in {insertStopwatch.Elapsed.TotalSeconds} seconds."); } finally { semaphore.Release(); } } static DataTable CreateTableSchema() { DataTable dataTable = new DataTable(); dataTable.Columns.Add("Column1", typeof(long)); dataTable.Columns.Add("Column2", typeof(long)); dataTable.Columns.Add("Column3", typeof(long)); dataTable.Columns.Add("Column4", typeof(long)); dataTable.Columns.Add("Column5", typeof(long)); dataTable.Columns.Add("Column6", typeof(long)); dataTable.Columns.Add("Column7", typeof(long)); dataTable.Columns.Add("Column8", typeof(long)); dataTable.Columns.Add("Column9", typeof(long)); dataTable.Columns.Add("Column10", typeof(long)); dataTable.Columns.Add("Column11", typeof(long)); dataTable.Columns.Add("Column12", typeof(long)); dataTable.Columns.Add("Column13", typeof(long)); dataTable.Columns.Add("Column14", typeof(DateTime)); dataTable.Columns.Add("Column15", typeof(double)); dataTable.Columns.Add("Column16", typeof(double)); dataTable.Columns.Add("Column17", typeof(string)); dataTable.Columns.Add("Column18", typeof(long)); dataTable.Columns.Add("Column19", typeof(DateTime)); dataTable.Columns.Add("Column20", typeof(DateTime)); dataTable.Columns.Add("Column21", typeof(DateTime)); dataTable.Columns.Add("Column22", typeof(string)); dataTable.Columns.Add("Column23", typeof(long)); dataTable.Columns.Add("Column24", typeof(double)); dataTable.Columns.Add("Column25", typeof(short)); dataTable.Columns.Add("Column26", typeof(short)); dataTable.Columns.Add("Column27", typeof(short)); dataTable.Columns.Add("Column28", typeof(short)); dataTable.Columns.Add("Column29", typeof(short)); dataTable.Columns.Add("Column30", typeof(short)); dataTable.Columns.Add("Column31", typeof(short)); dataTable.BeginLoadData(); dataTable.MinimumCapacity = batchSize; return dataTable; } static object ParseValue(string value, Type targetType, int i) { if (string.IsNullOrWhiteSpace(value)) return DBNull.Value; if (long.TryParse(value, out long longVal)) return longVal; if (double.TryParse(value, out double doubleVal)) return doubleVal; if (DateTime.TryParse(value, out DateTime dateVal)) return dateVal; return value; } } }Lesson Learned #510: Using CProfiler to Analyze Python Call Performance in Support Scenarios
Last week, while working on a support case, our customer was facing performance issues in their Python application. After some investigation, I decided to suggestCProfiler to identify which function call was taking the most time and use that as a starting point for troubleshooting. So profiling the Python code became essential to pinpoint the bottleneck.I suggested using CProfiler, a built-in Python module, which helps you profile your code and identify performance issues in real time.584Views0likes0CommentsDo you have slow workbooks due to size bloat? Give us a try at speeding up.
Hey Folks - Do you have slow workbooks due to size bloat? If so, then I am super excited to unveil Check Performance, Excel Performance team’s new capability to detect and remove size bloat due to unwanted formatted cells and speed up your workbooks. It is currently available to Excel M365 subscribers on the web.45KViews2likes23Comments