Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在面试中练习大型SQL Server索引或分区问题?_.net_Sql Server_Multithreading_Bigdata - Fatal编程技术网

.net 如何在面试中练习大型SQL Server索引或分区问题?

.net 如何在面试中练习大型SQL Server索引或分区问题?,.net,sql-server,multithreading,bigdata,.net,Sql Server,Multithreading,Bigdata,很抱歉,如果这是职业或工作场所堆栈交换。它似乎跨越了界限,所以我不确定该穿哪一件 我即将在一家非常理想的公司进行现场技术面试,但这远远超出了我目前的技能范围。我是一名高级Java人员。这个机会不仅仅是跨越.NET堆栈,而且是在一个团队中,他们正在对海量SQL Server数据库进行数十亿行的多线程查询,也许 有一次经理说,我不想浪费你的时间,但如果你愿意,我可以带你进来。。。我很惊讶他没有简单地说,对不起,你没有我们需要的技能。我完全不适应环境。在我的职业生涯中,我已经完成了不同数量和深度的SQ

很抱歉,如果这是职业或工作场所堆栈交换。它似乎跨越了界限,所以我不确定该穿哪一件

我即将在一家非常理想的公司进行现场技术面试,但这远远超出了我目前的技能范围。我是一名高级Java人员。这个机会不仅仅是跨越.NET堆栈,而且是在一个团队中,他们正在对海量SQL Server数据库进行数十亿行的多线程查询,也许

有一次经理说,我不想浪费你的时间,但如果你愿意,我可以带你进来。。。我很惊讶他没有简单地说,对不起,你没有我们需要的技能。我完全不适应环境。在我的职业生涯中,我已经完成了不同数量和深度的SQL,但没有达到这样的规模,最近也没有像Mongo和Amazon Dynamo那样做更多的noSQL。但我会坚持下去,因为我在这里找工作,讨厌现在的工作,而且有时间准备


我已经做了一些基本的搜索,比如SQL Server技术面试问题,并且已经开始仔细阅读,但这不能取代实际经验。有没有办法用一些大的公共数据来建立我自己的大型SQL Server来实践这一点呢?

我同意这是职业/工作场所之间的一个边界问题,但是这个问题更多的是在技术/软件开发人员的层面上,所以让我们尝试回答它

首先,祝贺有机会!我最近把工作从一个技术栈Ruby和一些C转换到一个相当不同的栈大型Java应用程序,有10多年的时间,所以我可以肯定地理解这是否同时感觉既有挑战性又有点可怕

因此,让我们关注以下几个方面:

您以前做过SQL查询,我假设您对关系代数、内部和外部联接、避免不必要的表扫描的适当索引的重要性有了一般性的了解——这是一种基本的东西。如果不是,那肯定是你可以训练的地方

您谈到在一个庞大的SQL server数据库上执行多线程查询—可能有数十亿行。我不能说这是否可能;大多数系统都没有这么大的数据库,但如果有迹象表明它有那么大,我认为没有理由对此提出质疑

但多线程是这里的关键。任何一个做过多线程编程的人都知道,您面临的挑战与传统顺序编程所面临的问题不同。我正在考虑锁定,试图避免死锁,试图避免首先锁定数据,诸如此类的事情。值得记住的是,Microsoft SQL Server的锁定策略与其他一些数据库不同,这取决于您以前使用过的数据库,因此了解何时使用以及何时不使用READ UNCOMMITTED有时非常关键。更多信息:

您还可以在问题中写道:

有没有办法用一些大的公共数据来建立我自己的大型SQL Server来实践这一点

我不确定我会推荐这个。我的意思是,如果你不知道一个主题,你就不能真的假装它,而仅仅为了面试而尝试学习更复杂的主题很少能起到很好的效果。对不起,听起来有点消极

这在很大程度上取决于你面试的公司。我经历过编码测试、电话面试和挑战性的五小时现场面试,但仍然没有得到这份工作。。。在另一家公司工作时,我刚刚与我事先认识的经理共进午餐,然后与几位关键人物进行电话面试,并来回发送电子邮件,直到我得到一份工作。因此,不同公司的要求和流程差别很大


我相信诚实,即使是在找工作的时候。做你自己,不要害怕你觉得自己缺乏的地方。如果您有多年的Java经验,我相信您可以很容易地学习.NET/C思维模式,特别是如果您使用过多线程编程,可能是依赖项注入/反转控制框架Spring等。我只想说明一下我将从哪里开始

创建不带VARCHARMAX的表以避免性能问题

CREATE TABLE Person 
(
PersonID INT NOT NULL,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Address VARCHAR(50)
)
插入一些测试数据。在加载数据之前,表不应该有任何索引,因为索引会降低插入性能

DECLARE @RunDate datetime
SET @RunDate=GETDATE()

DECLARE @values TABLE (DataValue int, RandValue INT)

;WITH mycte AS
(
SELECT 1 DataValue
UNION all
SELECT DataValue + 1
FROM mycte 
WHERE DataValue + 1 <= 1000000
)
INSERT INTO Person(PersonID, FirstName, LastName, Address)
SELECT 
DataValue
, 'FirstName' + CAST(DataValue AS VARCHAR(10)) 
, 'LastName' + CAST(DataValue AS VARCHAR(10)) 
, 'Address' + CAST(DataValue AS VARCHAR(10)) 
FROM mycte m 
OPTION (MAXRECURSION 0)
练习查询调优。在SSMS中点击Ctrl+M,可以看到查询计划。比较查询计划。尝试优化查询2:

进行I/O操作时,应使用异步操作。所以你需要 使用一些ORM。例如,实体框架 根据我的经验,我还没有找到在ASP.NET MVC中使用多线程的理由 使用IO时,所有逻辑都在数据库中执行。所以优化程序 SQLServer自行实现并行化。所以没有 需要使用 使用IO操作时使用多线程

public async Task<List<Person>> GetAllPersonsWithName(string personName)
{            
    return await db.Persons.Where(u => u.FirstName == personName).ToListAsync();
}
然后尝试异步运行存储过程。如果您使用异步操作,您的团队将很高兴

Task<int> firstResult = 
    db.Database.ExecuteSqlCommandAsync("exec FooProcedure @param", 
        new SqlParameter("@param", yourParam));
Task<int> secondResult = 
    db.Database.ExecuteSqlCommandAsync("exec FooProcedure1 @param1", 
        new SqlParameter("@param1", yourParam1));

await Task.WhenAll(mcResult, dcaiResult);

int fr = firstResult.Result;
int sr = secondResult.Result;

Console.WriteLine($"Results are fr {fr}, sr {sr} ");
在编写C和T-SQL代码时,还有一些建议:

C代码必须是异步的。async/await保存线程。高性能和可扩展性不能使用每个套接字一个线程

此外,如果您未来的团队使用EntityFramework,则在您选择数据而不是添加或更新数据时:

context.YourTable.AsNoTracking

尽量避免编写复杂的LINQ到实体查询。因为EntityFramework可以创建类型为VARCHARMAX的变量。这会降低性能。相反,只需创建用户定义的函数。对于复杂的逻辑,请使用存储过程、视图和用户定义的函数

尝试调整查询。读这个。此外,制作测试示例并尝试实现索引查找操作,查找并避免WHERE语句中的任何隐式\显式转换,向索引添加列或包含此列。可以在AdventureWorks数据库中进行优化查询


当然您可以使用adventureworks,MS的示例数据库。您还可以使用其他一些数据库。但是你对大的定义是什么?如今,数据的规模使得许多数据难以置信地模糊不清。老实说,任何一个得体的面试官都会看穿你的准备工作,很容易暴露出你知识深度的不足。如果不是在面试中,它将很快在工作中发生。Stack overflow也有一个数据下载,brent ozar对此有一个很好的介绍,只是想感谢您的长时间和全面的回复
public async Task<List<Person>> GetAllPersonsWithName(string personName)
{            
    return await db.Persons.Where(u => u.FirstName == personName).ToListAsync();
}
Task<int> firstResult = 
    db.Database.ExecuteSqlCommandAsync("exec FooProcedure @param", 
        new SqlParameter("@param", yourParam));
Task<int> secondResult = 
    db.Database.ExecuteSqlCommandAsync("exec FooProcedure1 @param1", 
        new SqlParameter("@param1", yourParam1));

await Task.WhenAll(mcResult, dcaiResult);

int fr = firstResult.Result;
int sr = secondResult.Result;

Console.WriteLine($"Results are fr {fr}, sr {sr} ");