愚蠢而简单的例子:假设我有一个表'Item',其中我保存了收到的项目的总数.
Item_Name Items_In_Stock
Run Code Online (Sandbox Code Playgroud)
项目名称是主键.当我收到数量为X的项目A时,如何实现以下目标.
如果该项目不存在,我为项目A插入一个新的,并将库存中的项目设置为X,如果存在库存中的项目为Y的记录,则库存中的项目中的新值为(X + Y)
INSERT INTO `item`
(`item_name`, items_in_stock)
VALUES( 'A', 27)
ON DUPLICATE KEY UPDATE
`new_items_count` = 27 + (SELECT items_in_stock where item_name = 'A' )
Run Code Online (Sandbox Code Playgroud)
我的问题是我的实际表中有多列.在更新部分中编写多个select语句是个好主意吗?
当然我可以在代码中完成它,但有更好的方法吗?
在您将此问题标记为重复之前,请听我说!
我已经阅读过这里提出的关于如何提高性能的问题,例如,提一下提高SQLite的每秒INSERT性能?和什么是源码的非常大的数据库文件的性能特点?
我正在努力使sqlite工作的数据库文件大小为5千兆字节.相反,那里有人,即使数据库大小高达160 GB,他们声称sqlite对他们来说"很棒".我自己没有尝试过,但是从提出的问题来看,我想所有的基准测试都可能只用数据库中的表来完成.
我使用的数据库
- 20页左右的表
-表中有一半以上的15列
-每个15或那么列的表都有6/7的外键列-其中的几个表已经长大在一个月内拥有2700万条记录
我使用的开发机器是3 GHz四核机器,有4 GB RAM,但只需要3分钟就可以查询这些大表中的row_count.
我找不到任何方法来水平划分数据.我拥有的最佳镜头是将数据分成多个数据库文件,每个表一个.但在这种情况下,据我所知,外键列约束不能使用,所以我将不得不创建一个自足表(没有任何外键).
所以我的问题是
a)我是否使用错误的数据库进行工作?
b)你觉得我哪里出错了?
c)我还没有在外键上添加索引,但如果只是行计数查询需要四分钟,外键索引如何帮助我?
编辑提供更多信息,即使没有人要求它:)我使用SQLite版本3.7.9与system.data.sqlite.dll版本1.0.77.0
EDIT2:我认为我与160位演员的不同之处在于他们可以选择单独的唱片或小范围的唱片.但是我必须在表中加载所有2700万行,将它们与另一个表连接起来,按照用户的要求对记录进行分组并返回结果.有什么输入是为这些结果优化数据库的最佳方法.
我不能缓存先前查询的结果,因为它在我的情况下没有意义.点击缓存的可能性相当低.
任何人都可以解释为什么.net框架在我使用Enumerable.OrderBy时不会调用我的比较器的比较方法.而当我使用List.Sort()时它会被调用.
//以下代码取自StackOverFlow.com上的另一篇文章
class Employee
{
public string Name { get; set; }
public int Salary { get; set; }
}
class Employee_SortBySalaryByAscendingOrder : IComparer<Employee>
{
#region IComparer<Employee> Members
public int Compare(Employee x, Employee y)
{
if (x.Salary > y.Salary) return 1;
else if (x.Salary < y.Salary) return -1;
else return 0;
}
#endregion
}
private void TestSort(object sender, EventArgs e)
{
List<Employee> empList = new List<Employee>()
{
new Employee { Name = "a", Salary = 14000 },
new Employee { …Run Code Online (Sandbox Code Playgroud)