我们每天最多有30 GB的GZip压缩日志文件.每个文件保存100.000行,压缩后为6到8 MB.解析逻辑已被剥离的简化代码利用Parallel.ForEach循环.
在两个NUMA节点上,MaxDegreeOfParallelism为8处理的最大行数达到峰值,32个逻辑CPU盒(Intel Xeon E7-2820 @ 2 GHz):
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.IO;
using System.IO.Compression;
using System.Threading.Tasks;
namespace ParallelLineCount
{
public class ScriptMain
{
static void Main(String[] args)
{
int maxMaxDOP = (args.Length > 0) ? Convert.ToInt16(args[0]) : 2;
string fileLocation = (args.Length > 1) ? args[1] : "C:\\Temp\\SomeFiles" ;
string filePattern = (args.Length > 1) ? args[2] : "*2012-10-30.*.gz";
string fileNamePrefix = (args.Length > 1) ? args[3] : "LineCounts";
Console.WriteLine("Start: {0}", DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"));
Console.WriteLine("Processing file(s): {0}", …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的存储过程实现通用日志记录.我找到的最佳解决方案是使用DBCC INPUTBUFFER,它返回过程调用的文本,如:
DECLARE @a INT
SET @a = 1000
EXEC usp_Test @param = @a
Run Code Online (Sandbox Code Playgroud)
但它有一个限制,这个缓冲区的最大长度是4000.我有很多具有表值参数的过程,并且它们通常包含> 10000条记录,所以我不能用这种方法记录这个调用.
有没有办法实现这样的日志记录,而无需在每个过程中手动创建"过程调用文本"?
我的最终目标是从缓存的执行计划中自动提取所有引用的列。这将帮助我们跟踪我们预定的 SSRS 报告集使用的所有列。
感兴趣的 XML 数据如下所示:
<ColumnReference Database="[AdventureWorksDW2012]" Schema="[dbo]" Table="[DimCustomer]" Alias="[dC]" Column="HouseOwnerFlag" />
Run Code Online (Sandbox Code Playgroud)
我想在表中存储数据库、架构、表、别名和列值。
但是,为了概念验证,我进行了一个简单的查询,并将完整执行计划的以下部分复制到下面的 TSQL 代码中:
DECLARE @myDoc xml;
SET @myDoc = '<ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.2" Build="11.0.3381.0" TEST="1">
<BatchSequence>
<Batch>
<Statements>
<StmtSimple StatementText="SELECT ... 
" StatementId="1" StatementCompId="1" ThereIsMoreHere="..." >
<StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="true" ThereIsMoreHere="..." />
</StmtSimple>
</Statements>
</Batch>
</BatchSequence>
</ShowPlanXML>';
SELECT StatementId = @myDoc.value('(/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/@StatementId)[1]', 'int');
SELECT StatementId = @myDoc.value('(/ShowPlanXML/@TEST)[1]', 'int');
Run Code Online (Sandbox Code Playgroud)
两个 SELECT 语句都返回 NULL。这里有什么问题?我觉得我正在慢慢失明。这是针对 SQL Server 2012 SP1 Developers 版本执行的。