DataBase杂谈
在拜读Joseph albahari的Threading in C#文章中,从线程问题的提出,到解决方案的实现。及后续利用Microsoft提供的现成DLL提供的现有方法来处理,
多线程之间相互关联及处理方法。感慨千万。
而后,进入其广告链接LinqPad工具后,下载安装,读到关于循环查询的语句时,涉及到循环从DB数据中进行查询,采用Predicate的一个方法,可以解决反复查询数据库的问题。
IQueryable<Product> SearchProducts (params string[] keywords) { var predicate = PredicateBuilder.False<Product>(); foreach (string keyword in keywords) { string temp = keyword; predicate = predicate.Or (p => p.Description.Contains (temp)); } return dataContext.Products.Where (predicate);}
using System; using System.Linq; using System.Linq.Expressions; using System.Collections.Generic; public static class PredicateBuilder { public static Expression<Func<T, bool>> True<T> () { return f => true; } public static Expression<Func<T, bool>> False<T> () { return f => false; } public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ()); return Expression.Lambda<Func<T, bool>> (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);} public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ()); return Expression.Lambda<Func<T, bool>> (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters); } }
最终通过循环添加执行语句后,变成OR。而,通常是用的查询语句中,会碰到OR, IN, BETWEEN, 甚至用到 >、<、!=等具体的方法。
在使用Index的情况下, 性能最优顺序 BETWEEN > Unit ALL > IN > OR 等方法。当然如果不存在Index的情况下,相差无几。
前日刚好对之前管理的DB客户服务器进行了Index Rebuild,将原本存在个Page也上的Index进行了断边化处理。 原本的NONClustered Index改成Clustered Index。
普通的针对数据保护容错方面的对应措施。多Session并存控制
在SQLServer的DB环境中,有如下几种模式
READ UNCOMMITTED
READ COMMITTED (Default)
REPEATABLE READ
SERIALIZABLE
SNAPSHOT
普通默认模式是Read Commited,即保证多个Session之间的基本隔离。
https://www.interfacett.com/blogs/understanding-isolation-levels-sql-server-2008-r2-2012-examples/
Love it, and you live without it