小编Cha*_*pol的帖子

外键是否提高了查询性能?

假设我有2个表,Products和ProductCategories.两个表都与CategoryId有关系.这是查询.

SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category
FROM Products p
INNER JOIN ProductCategories c ON p.CategoryId = c.CategoryId
WHERE c.CategoryId = 1;
Run Code Online (Sandbox Code Playgroud)

当我创建执行计划时,表ProductCategories执行集群索引查找,这是期望的.但对于表产品,它执行集群索引扫描,这让我怀疑.为什么FK无助于提高查询性能?

所以我必须在Products.CategoryId上创建索引.当我再次创建执行计划时,两个表都执行索引查找.估计的子树成本降低了很多.

我的问题是:

  1. 除了FK有助于关系约束,它还有其他用处吗?它是否提高了查询性能?

  2. 我应该在所有表中的所有FK列(如Products.CategoryId)上创建索引吗?

sql sql-server indexing performance foreign-keys

148
推荐指数
3
解决办法
8万
查看次数

使用Thread.Sleep和Timer进行比较以延迟执行

我有一个方法应该延迟运行指定的时间.

我应该用吗?

Thread thread = new Thread(() => {
    Thread.Sleep(millisecond);
    action();
});
thread.IsBackground = true;
thread.Start();
Run Code Online (Sandbox Code Playgroud)

要么

Timer timer = new Timer(o => action(), null, millisecond, -1);
Run Code Online (Sandbox Code Playgroud)

我读过一些关于使用的文章Thread.Sleep是糟糕的设计.但我真的不明白为什么.

但是对于使用Timer,Timer有配置方法.由于执行延迟,我不知道如何配置Timer.你有什么建议吗?

或者如果你有延迟执行的替代代码也很感激.

c# multithreading sleep timer delayed-execution

56
推荐指数
3
解决办法
6万
查看次数

Interlocked是否提供所有线程的可见性?

假设我有一个变量"counter",并且有几个线程通过使用Interlocked访问和设置"counter"的值,即:

int value = Interlocked.Increment(ref counter);
Run Code Online (Sandbox Code Playgroud)

int value = Interlocked.Decrement(ref counter);
Run Code Online (Sandbox Code Playgroud)

我可以假设,Interlocked所做的更改将在所有线程中可见吗?

如果没有,我该怎么做才能使所有线程同步变量?

编辑:有人建议我使用volatile.但是当我将"计数器"设置为volatile时,会出现编译器警告"对volatile字段的引用不会被视为volatile".

当我阅读在线帮助时,它说:"通常不应使用ref或out参数传递易失性字段".

c# multithreading visibility interlocked

7
推荐指数
2
解决办法
1701
查看次数

结构的最佳解决方案,超过16个字节

我有一种我认为用它作为结构的类型.

  • 它代表单一价值
  • 这是不可改变的

但问题是,它有6个int字段.

那么我应该为这种类型使用哪种解决方案?

  1. 继续使用struct?
  2. 换班?
  3. 或者将6个整数打包成int数组,因此它只有一个字段

编辑

具有6个整数字段的struct的大小是24字节,这是很难传递的.struct的推荐大小不超过16个字节

c# optimization struct class

3
推荐指数
1
解决办法
799
查看次数

是否有任何命令立即更新UI?

我想使用此代码更新从1到100的进度条.

for (int i = 0; i <= 100; i++) {
    System.Threading.Thread.Sleep(100);
    progressBar1.Value = i;
}
Run Code Online (Sandbox Code Playgroud)

但结果是,UI冻结直到循环完成.

我知道Dispatcher可以提供帮助,但我不想拆分功能.

是否有任何命令立即更新UI像..

for (int i = 0; i <= 100; i++) {
    System.Threading.Thread.Sleep(100);
    progressBar1.Value = i;
    UpdateUINow();
}
Run Code Online (Sandbox Code Playgroud)

编辑:我正在使用WPF,我使用Thread.Sleep来模拟长时间运行的进程.

事实上,我想要任何喜欢的命令Application.DoEvents.但是我在WPF中找不到这个命令.

c# wpf user-interface asynchronous dispatcher

3
推荐指数
1
解决办法
3060
查看次数