在SQL Server 2008中,我想将数据库中的所有非聚集索引移动到辅助文件组.最简单的方法是什么?
从我最近的一些测试和阅读中看来,似乎XLOCK的"X"(独家)名称部分具有误导性.它实际上不会锁定UPDLOCK.如果它是独占的,它将阻止外部SELECT,但它不会.
我无法从阅读或测试中看到两者之间的区别.
XLOCK创建独占锁的唯一时间是与TABLOCK一起使用时.我的第一个问题是"为什么只有这种粒度?"
此外,我遇到了一个博客,其中说明了以下内容:
但请注意XLOCK提示.SQL Server将有效地忽略XLOCK提示!SQL Server检查自最早的打开事务以来数据是否已更改,这是一种优化.如果不是,则忽略xlock.这使得xlock提示基本上没用,应该避免.
有人遇到过这种现象吗?
根据我所看到的情况,似乎应该忽略这一提示.
至于最佳实践,使用之间是否存在有意义的差异:
Double d;
Run Code Online (Sandbox Code Playgroud)
和
double d;
Run Code Online (Sandbox Code Playgroud)
我知道最佳实践充满了矛盾,所以我知道答案可能会有所不同.我只是想知道两者之间的实用差异.
我花了很多周时间在C#4.0中进行多线程编码.但是,有一个问题对我来说仍然没有答案.
我知道volatile关键字阻止编译器将变量存储在寄存器中,从而避免无意中读取过时值.写入在.Net中总是不稳定的,因此任何说明它也避免了stales写入的文档都是多余的.
我也知道编译器优化有些"不可预测".以下代码将说明由于编译器优化而导致的停顿(在VS之外运行发布编译时):
class Test
{
public struct Data
{
public int _loop;
}
public static Data data;
public static void Main()
{
data._loop = 1;
Test test1 = new Test();
new Thread(() =>
{
data._loop = 0;
}
).Start();
do
{
if (data._loop != 1)
{
break;
}
//Thread.Yield();
} while (true);
// will never terminate
}
}
Run Code Online (Sandbox Code Playgroud)
代码表现如预期.但是,如果我取消注释//Thread.Yield(); 行,然后循环将退出.
此外,如果我在do循环之前放入Sleep语句,它将退出.我不明白.
当然,用volatile来装饰_loop也会导致循环退出(以其显示的模式).
我的问题是:编译器遵循的规则是什么,以确定何时隐含执行易失性读取?为什么我仍然可以通过我认为奇怪的措施退出循环?
编辑
IL代码如图所示(档位):
L_0038: ldsflda valuetype ConsoleApplication1.Test/Data ConsoleApplication1.Test::data
L_003d: ldfld int32 ConsoleApplication1.Test/Data::_loop
L_0042: ldc.i4.1
L_0043: beq.s L_0038 …Run Code Online (Sandbox Code Playgroud) 编辑:我的问题是,"为什么我的第一个代码示例有效?" 请继续阅读......
编辑1:毫无疑问,唯一约束是确保不会发生重复的正确方法.这是给定的.但是,有时我们需要知道我们正在尝试重复输入.此外,这篇文章不仅仅是处理重复.
这可能是对SO的100多个问题的重复.我已经阅读了关于原子更新,锁和并发的简单问题的无穷无尽的混淆和矛盾.
我看到博客和专家在这些方面存在广泛的分歧.在这里,我根据人们建议的各种解决方案提供测试代码,指出结果,陈述我的观点,并邀请您的评论.
上下文:我正在运行SQL Server 2008 Express SP2.
我创建了以下测试表:
create table dbo.Temp (Col int)
Run Code Online (Sandbox Code Playgroud)
由于我们想要测试SQL代码的想法而不是约束,因此该表故意不对其进行约束.
我在2个然后3个查询窗口中同时运行以下命令:
declare @i int
set @i = 0
while @i < 5000 begin
set @i = @i + 1
update dbo.temp set Col = (SELECT Col from dbo.Temp) + 1
end
Run Code Online (Sandbox Code Playgroud)
我可以看到,我没有使用任何显式锁定.所有数据库设置均为默认值 我检查了Col的值,它是所需的数字:25,000.没有错过.
由于SQL Server是ACID,"A"告诉我们单个语句是以原子方式执行的.因此,基于上述内容,我们可以同意那些说如上所述的简单更新不需要锁定的人.
接下来,我在3个查询窗口中同时运行以下命令:
while @i < 5000 begin
set @i = @i + 1
insert into dbo.temp select @i where not exists
(select 1 from dbo.temp where Col …Run Code Online (Sandbox Code Playgroud) 在SQL Server 2008中,我使用的是MERGE.一切都很好,除了我有2个可以为空的列.如果我传递一个空值并且目标不是null,则MERGE没有看到差异(每个BOL对ev = false = false ).如果我在两侧使用IsNull(源和目标),但有可能错误评估值的问题.
我的意思是,如果我说:
WHEN MATCHED AND NOT (IsNull(tgt.C, 0) = IsNull(src.C, 0)) THEN
Run Code Online (Sandbox Code Playgroud)
那么如果tgt.C为null且src.C = 0,则不会执行更新.无论我选择什么替代价值,我都会遇到这个问题.
我还尝试了"AND NOT(... true ...)"语法,因为BOL声明对null的评估结果为FALSE.但是,它们似乎实际上导致NULL并且不会导致我的多部分语句变为false.
我认为一种解决方案是使用NaN或-INF或+ INF,因为它们在目标中无效.但是我找不到在SQL中表达这种方法的方法.
任何想法如何解决这个问题?
编辑:
以下逻辑解决了这个问题,但它很冗长,不会导致快速逃避:
declare @i int, @j int
set @j = 0
set @i = 0
if ISNULL(@i, 0) != ISNULL(@j, 0) OR
((@i is null or @j is null) and not (@i is null and @j is null))
print 'update';
Run Code Online (Sandbox Code Playgroud) 我试图从JPG中提取BitmapImage.这是我的代码:
FileStream fIn = new FileStream(sourceFileName, FileMode.Open); // source JPG
Bitmap dImg = new Bitmap(fIn);
MemoryStream ms = new MemoryStream();
dImg.Save(ms, ImageFormat.Jpeg);
image = new BitmapImage();
image.BeginInit();
image.StreamSource = new MemoryStream(ms.ToArray());
image.EndInit();
ms.Close();
Run Code Online (Sandbox Code Playgroud)
图像以0×0图像返回,这当然意味着它不起作用.我该怎么做呢?
我有一个特定的数据操作要求,我已经解决了如何在SQL Server和PostgreSQL中做.但是,我对速度不太满意,所以我正在调查MongoDB.
描述查询的最佳方法如下.描绘美国的分层数据:国家,州,县,市.假设一个特定的供应商可以为整个加州服务.另一个可能只服务于洛杉矶.可能有数十万个供应商,他们都可以从这个层次结构中的某些点进行服务.我并没有把它与Geo混淆 - 我用它来说明需要.
使用递归查询,可以很容易地获得可以为特定用户提供服务的所有供应商的列表.如果他是在说帕萨迪纳,美国加利福尼亚州洛杉矶,我们会走到层次得到应用的ID,然后查询回落,找到供应商.
我知道这可以优化.同样,这只是一个简单的查询示例.
我知道MongoDB是一个文档存储.这非常适合我的其他需求.问题是它对我描述的查询类型有多适合?(我知道它没有连接 - 这些是模拟的).
我知道这是一个"一段字符串多长时间"的问题.我只是想知道是否有任何人有使用MongoDB做这种事情的经验.从0到测试可能需要一段时间,如果MongoDB不适合这个,我希望节省时间.
例
当地的电影商店"A"可以在斯普林菲尔德供应Blu-Rays.具有全州分布的连锁店"B"可以向所有IL提供Blu-Rays.按需下载商店"C"可以供应给所有美国用户.
如果我们想要获得伊利诺斯州斯普林菲尔德的所有适用电影供应商,那么答案将是[A,B,C].
换句话说,在层次结构上有许多不同级别的供应商.
我非常了解MongoDB的可扩展性如何令人惊讶,特别是它的自动分片,以及将服务器热添加到集群的能力.
但是,我没有找到关于PostgreSQL可扩展性的大量数据.我知道它有表空间,就像其他RDBMS一样.它可以自动增长(如分片)吗?或者它是像SQL Server中的手动过程?
有谁知道我可以在哪里获得更多数据?
我一直在使用TextTemplatingFilePreprocessor上T4阅读文章展示了如何动态地生成成为项目的一部分,并与该项目编译的代码.
是否可以使用T4生成在运行时编译,输出到DLL并加载和执行的代码,所述代码可以访问与dll相关的常用可见性功能?
如果是的话,请你指点一个例子.
我有效地尝试使用IL生成动态dll,而不是使用C#.
编辑
我需要的具体案例很简单.我正在编写一个消息路由器,用于将消息路由到服务.服务可以是本地的或远程的.声明性脚本编译为C#.动态部分是"这项服务是本地还是远程服务?".输出C#相应地改变.本地/远程的路由风格不同,因此具有动态特性.
这是我需要的一个例子.
sql-server ×4
c# ×3
.net ×2
locking ×2
mongodb ×2
.net-4.0 ×1
bitmap ×1
bitmapimage ×1
concurrency ×1
filegroup ×1
indexing ×1
jpeg ×1
null ×1
postgresql ×1
rdbms ×1
scalability ×1
sharding ×1
t4 ×1