针对实际示例,何时在SQL中使用OUTER/CROSSAPPLY这个问题,本篇文章进行了详细的解答,同时本文还将给你拓展JPA2CriteriaAPI更可取的实际示例是什么?、multiprocess
针对实际示例,何时在SQL中使用OUTER / CROSS APPLY这个问题,本篇文章进行了详细的解答,同时本文还将给你拓展JPA2 Criteria API更可取的实际示例是什么?、multiprocessing.Pool:何时使用 apply、apply_async 或 map?、NoSQL与RDBMS:何时使用,何时不使用、php – 何时在SQL查询中使用FOR UPDATE?等相关知识,希望可以帮助到你。
本文目录一览:- 实际示例,何时在SQL中使用OUTER / CROSS APPLY
- JPA2 Criteria API更可取的实际示例是什么?
- multiprocessing.Pool:何时使用 apply、apply_async 或 map?
- NoSQL与RDBMS:何时使用,何时不使用
- php – 何时在SQL查询中使用FOR UPDATE?
实际示例,何时在SQL中使用OUTER / CROSS APPLY
我一直在CROSS / OUTER APPLY和一位同事一起研究,我们正在努力寻找在何处使用它们的真实示例。
我已经花了很多时间研究什么时候应该在内部联接上使用交叉申请?和谷歌搜索,但主要的(唯一的)示例似乎很奇怪(使用一个表中的行数来确定要从另一个表中选择多少行)。
我认为这种情况可能会受益于OUTER APPLY:
联系人表(每个联系人包含1条记录)通信条目表(每个联系人可以包含n个电话,传真,电子邮件)
但是,使用子查询,通用表表达式OUTER JOIN以及RANK()和OUTER APPLY似乎都表现相同。我猜这意味着该方案不适用于APPLY。
请分享一些现实生活中的例子,并帮助解释该功能!
答案1
小编典典一些用途APPLY是…
1) 每组查询的前N个(某些基数可能更有效)
SELECT pr.name, pa.nameFROM sys.procedures pr OUTER APPLY (SELECT TOP 2 * FROM sys.parameters pa WHERE pa.object_id = pr.object_id ORDER BY pr.name) paORDER BY pr.name, pa.name
2)为外部查询中的每一行调用一个表值函数
SELECT *FROM sys.dm_exec_query_stats AS qsCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)
3) 重用列别名
SELECT number, doubled_number, doubled_number_plus_oneFROM master..spt_valuesCROSS APPLY (SELECT 2 * CAST(number AS BIGINT)) CA1(doubled_number) CROSS APPLY (SELECT doubled_number + 1) CA2(doubled_number_plus_one)
4) 取消不止一组列
假设1NF违反了表格结构。
CREATE TABLE T ( Id INT PRIMARY KEY, Foo1 INT, Foo2 INT, Foo3 INT, Bar1 INT, Bar2 INT, Bar3 INT );
使用2008+VALUES语法的示例。
SELECT Id, Foo, BarFROM T CROSS APPLY (VALUES(Foo1, Bar1), (Foo2, Bar2), (Foo3, Bar3)) V(Foo, Bar);
在2005年UNION ALL可以代替使用。
SELECT Id, Foo, BarFROM T CROSS APPLY (SELECT Foo1, Bar1 UNION ALL SELECT Foo2, Bar2 UNION ALL SELECT Foo3, Bar3) V(Foo, Bar);
JPA2 Criteria API更可取的实际示例是什么?
我看了JPA 2.0 Criteria API,但与Hibernate Criteria不同,我发现它过于繁琐。是否有充分的理由使用JPA 2.0
Criteria API而不是使用JPA-QL?感谢您的意见。
答案1
小编典典像Hibernate Criteria API一样,JPA 2.0 Criteria API特别适合 动态
构建查询,以处理查询结构根据运行时条件而变化的情况。
但是还有更多。尽管比Hibernate的Criteria API更为冗长,但是JPA Criteria API允许构建 类型安全的
查询(如果您使用Metamodel API)。下面是一个例子:
EntityManager em = ...QueryBuilder qb = em.getQueryBuilder();CriteriaQuery<Person> c = qb.createQuery(Person.class);Root<Person> p = c.from(Person.class);Predicate condition = qb.gt(p.get(Person_.age), 20);c.where(condition);TypedQuery<Person> q = em.createQuery(c); List<Person> result = q.getResultList();
在以上代码段中,以下示例会引发编译错误:
Predicate condition = qb.gt(p.get(Person_.age, "xyz"));
如果您想知道,Person_
是 静态的,实例化的,规范的元模型类,它
对应于原始Person
实体类(由注释处理器生成)。它提供了一种强类型替代基于运行时反射的方法:
Field field = Person.class.getField("age");
优点:
- 类型安全,编译时验证!
- 禁止构造语法上不正确的查询。
- 重构后可能引发编译错误。
- 提供开箱即用的自动完成支持
- 更适合动态查询。
缺点:
- 更详细。
- 可读性较差。
总的来说,我对JPQL感到更自在,但Criteria API的类型安全性与JPQL(以及Hibernate Criteria API)是一个主要区别。
也可以看看
- 使用Criteria API和Metamodel API创建基本的类型安全查询
- JPA 2.0中的动态类型安全查询
- 比较JPQL,基于标准字符串和类型安全的查询
- JPA的类型安全标准查询API
multiprocessing.Pool:何时使用 apply、apply_async 或 map?
我还没有看到Pool.apply、Pool.apply_async和Pool.map用例的明确示例。我主要使用Pool.map
;
别人的优点是什么?
答案1
小编典典回到 Python 的旧时代,要调用带有任意参数的函数,您可以使用apply
:
apply(f,args,kwargs)
apply
在 Python2.7 中仍然存在,但在 Python3 中没有,一般不再使用。如今,
f(*args,**kwargs)
是首选。这些multiprocessing.Pool
模块试图提供类似的接口。
Pool.apply
与 Python 类似apply
,只是函数调用是在单独的进程中执行的。Pool.apply
阻塞直到函数完成。
Pool.apply_async
也像 Python
的内置apply
,只是调用立即返回而不是等待结果。返回一个AsyncResult
对象。您调用它的get()
方法来检索函数调用的结果。该get()
方法阻塞,直到函数完成。因此,pool.apply(func,args, kwargs)
等价于pool.apply_async(func, args, kwargs).get()
。
与
相比Pool.apply
,该Pool.apply_async
方法还具有一个回调,如果提供,则在函数完成时调用该回调。这可以用来代替调用get()
.
例如:
import multiprocessing as mpimport timedef foo_pool(x): time.sleep(2) return x*xresult_list = []def log_result(result): # This is called whenever foo_pool(i) returns a result. # result_list is modified only by the main process, not the pool workers. result_list.append(result)def apply_async_with_callback(): pool = mp.Pool() for i in range(10): pool.apply_async(foo_pool, args = (i, ), callback = log_result) pool.close() pool.join() print(result_list)if __name__ == ''__main__'': apply_async_with_callback()
可能会产生一个结果,例如
[1, 0, 4, 9, 25, 16, 49, 36, 81, 64]
请注意,与 不同pool.map
,结果的顺序可能与pool.apply_async
调用的顺序不对应。
因此,如果您需要在单独的进程中运行一个函数,但希望当前进程 阻塞 直到该函数返回,请使用Pool.apply
.
像Pool.apply
,Pool.map
阻塞,直到返回完整的结果。
如果您希望工作进程池异步执行许多函数调用,请使用Pool.apply_async
. 结果的 顺序
不能保证与调用的顺序相同Pool.apply_async
。
另请注意,您可以调用许多 不同 的函数Pool.apply_async
(并非所有调用都需要使用相同的函数)。
相反,Pool.map
将相同的函数应用于许多参数。但是,与 不同Pool.apply_async
的是,结果以与参数顺序相对应的顺序返回。
NoSQL与RDBMS:何时使用,何时不使用
本文来源于InfoQ中文站原创的文章,原文地址是:
NareshKumar是位软件工程师与热情的博主,对于编程与新事物拥有极大的兴趣,非常乐于与其他开发者和程序员分享技术上的研究成果。近日,Naresh撰文比较了Nosql与RDBMS,并详细介绍了他们各自的特点与适用的场景。
Nosql并不是关系型数据库管理系统,本文将会介绍Nosql数据库与关系型数据库之间的差别,同时还会讨论在何种场景下应该使用Nosql,何种场景下不应该使用。由于Nosql还是个相对较新的技术,因此它还面临着很多挑战。
时至今日,互联网上有数以亿计的用户。大数据与云计算已经成为很多主要的互联网应用都在使用或是准备使用的技术,这是因为互联网用户每天都在不断增长,数据也变得越来越复杂,而且有很多非结构化的数据存在,这是很难通过传统的关系型数据库管理系统来处理的。Nosql技术则能比较好地解决这个问题,它主要用于非结构化的大数据与云计算上。从这个角度来看,Nosql是一种全新的数据库思维方式。
为何要使用Nosql数据库?
1.Nosql具有灵活的数据模型,可以处理非结构化/半结构化的大数据
现在,我们可以通过Facebook、D&B等第三方轻松获得与访问数据,如个人用户信息、地理位置数据、社交图谱、用户产生的内容、机器日志数据以及传感器生成的数据等。对这些数据的使用正在快速改变着通信、购物、广告、娱乐以及关系管理的特质。没有使用这些数据的应用很快就会被用户所遗忘。开发者希望使用非常灵活的数据库,能够轻松容纳新的数据类型,并且不会被第三方数据提供商内容结构的变化所累。很多新数据都是非结构化或是半结构化的,因此开发者还需要能够高效存储这种数据的数据库。但遗憾的是,关系型数据库所使用的定义严格、基于模式的方式是无法快速容纳新的数据类型的,对于非结构化或是半结构化的数据更是无能为力。Nosql提供的数据模型则能很好地满足这种需求。很多应用都会从这种非结构化数据模型中获益,比如说CRM、ERP、BPM等等,他们可以通过这种灵活性存储数据而无需修改表或是创建更多的列。这些数据库也非常适合于创建原型或是快速应用,因为这种灵活性使得新特性的开发变得非常容易。
2.Nosql很容易实现可伸缩性(向上扩展与水平扩展)
如果有很多用户在频繁且并发地使用你的应用,那么你就需要考虑可伸缩的数据库技术而非传统的RDBMS了。对于关系型技术来说,很多应用开发者会发现动态的可伸缩性是难以实现的,这时就应该考虑切换到Nosql数据库上。对于云应用来说,关系型数据库一开始是普遍的选择。然而,在使用过程中却遇到了越来越多的问题,原因就在于他们是中心化的,向上扩展而非水平扩展的。这使得他们不适合于那些需要简单且动态可伸缩性的应用。Nosql数据库从一开始就是分布式、水平扩展的,因此非常适合于互联网应用分布式的特性。
在三层互联网架构的Web/应用层上,多年来向上扩展已经成为默认的扩展方式了。随着应用使用人数的激增,我们需要添加更多的服务器,性能则是通过负载均衡来实现的,这时的代价与用户数量成线性比例关系。在Nosql数据库之前,数据库层的默认扩展方式就是向上扩展。为了支持更多的并发用户以及存储更多的数据,你需要越来越好的服务器,更好的cpu、更多的内存、更大的磁盘来维护所有表。然而,好的服务器意味着更加复杂、私有、并且也更加昂贵。这与Web/应用层所使用的便宜的硬件形成了鲜明的对比。
3.动态模式
关系型数据库需要在添加数据前先定义好模式。比如说,你需要存储客户的电话号码、姓名、地址、城市与州等信息,sql数据库需要提前知晓你要存的是什么。这对于敏捷开发模式来说是场灾难,因为每次完成新特性时,数据库的模式通常都需要改变。因此,如果在开发过程中想将客户喜欢的条目加到数据库中,那就得向表中添加这一列才行,然后要做的就是将整个数据库迁移到新的模式上。
4.自动分片
由于是结构化的,关系型数据库通常会垂直扩展,单台服务器要持有整个数据库来确保可靠性与数据的持续可用性。这样做的代价就是非常昂贵、扩展受到限制,并且数据库基础设施会成为失败点。这个问题的解决方案就是水平扩展,添加服务器而不是为单台服务器增加更多的能力。Nosql数据库通常都支持自动分片,这意味着他们本质上就会自动在多台服务器上分发数据,应用甚至都不知道这些事情。数据与查询负载会自动在多台服务器上做到平衡,当某台服务器当机时,它能快速且透明地被替换掉。
5.复制
大多数Nosql数据库也支持自动复制,这意味着你可以获得高可用性与灾备恢复功能。从开发者的角度来看,存储环境本质上是虚拟化的。
Nosql数据库面临的挑战
1.成熟度
RDBMS系统由来已久。Nosql拥护者们会说RDBMS的高龄是其衰退的标志,不过对于大多数CIO来说,RDBMS的成熟让人放心。对于大多数情况来说,RDBMS系统是稳定且功能丰富的。相比较而言,大多数Nosql数据库则还有很多特性有待实现。
2.支持
企业需要的是安心,如果关键系统出现了故障,他们可以获得即时的支持。所有RDBMS厂商都在不遗余力地提供良好的企业支持。与之相反,大多数Nosql系统都是开源项目,虽然每种数据库都有那么几家公司提供支持,不过这些公司大多都是小的初创公司,没有全球支持资源,也没有Oracle、微软或是IBM那种令人放心的公信力。
3.分析与商业智能
Nosql数据库在Web2.0应用时代开始出现。因此,大多数特性都是面向这些应用的需要的。然而,应用中的数据对于业务来说是有价值的,这种价值远远超出了Web应用那种CRUD。企业数据库中的业务信息可以帮助改进效率并提升竞争力,商业智能对于大中型企业来说是个非常关键的IT问题。
4.管理
Nosql的设计目标是提供零管理的解决方案,不过当今的现实却离这个目标还相去甚远。现在的Nosql需要很多技巧才能用好,并且需要不少人力、物力来维护。
5.专业
全球有很多开发者,每个业务部门都会有熟悉RDBMS概念与编程的人。相反,几乎每个Nosql开发者都处于学习模式。这种状况会随着时间的流逝而发生改观。但现在,找到一个有经验的RDBMS程序员或是管理员要比Nosql专家容易多了。
结论
Nosql数据库正在成为数据库领域的重要力量。如果使用恰当,那么它会带来很多好处。然而,企业应该非常小心并注意到这些数据库的限制与问题。
php – 何时在SQL查询中使用FOR UPDATE?
参见英文答案 > MySQL ‘select for update’ behaviour 1个
任何人都可以告诉以下sql之间的区别,
SELECT * FROM TABLE
VS
SELECT * FROM TABLE FOR UPDATE
何时以及在什么情况下我需要使用For Update
如果我使用更新并停止,则需要更多时间来获取数据.在更新上发生了什么以增加时间.请告诉我整个过程发生在这上面.
解决方法:
我认为MariaDB / MysqL手册中的句子是不言自明的:
如果对使用页锁或行锁的存储引擎使用FOR UPDATE,则查询检查的行将被写入锁定,直到当前事务结束.
今天关于实际示例,何时在SQL中使用OUTER / CROSS APPLY的分享就到这里,希望大家有所收获,若想了解更多关于JPA2 Criteria API更可取的实际示例是什么?、multiprocessing.Pool:何时使用 apply、apply_async 或 map?、NoSQL与RDBMS:何时使用,何时不使用、php – 何时在SQL查询中使用FOR UPDATE?等相关知识,可以在本站进行查询。
本文标签: