今天我们来看看FetchExpression表达式吧,在Dynamics CRM 系统中它可以说是无所不在呀。大家都知道我们查询数据库中的数据会用到SQL语言,把Dynamics CRM 系统比作数据库的话呢,FetchExpresion就是它的SQL啦。
当然啦,FetchExpression没有SQL那么灵活。但是作为一个用XML来描述查询信息的引擎来说也确实挺棒的!我们先来看一个简单的FetchExpression表达式吧:
用Dynamics CRM 2011 高级查找编辑器编辑如下图中的查询:
高级查找编辑器对应的Fetch表达式
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false"> <entity name="account"> <attribute name="accountid" /> <attribute name="address1_city" /> <attribute name="address1_addresstypecode" /> <attribute name="name" /> <order attribute="address1_city" descending="false" /> <filter type="and"> <filter type="or"> <condition attribute="name" operator="eq" value="Microsoft" /> <condition attribute="accountnumber" operator="eq" value="123456" /> </filter> <filter type="and"> <condition attribute="address1_line1" operator="eq" value="ShangHai" /> <condition attribute="address1_telephone2" operator="eq" value="135********" /> </filter> </filter> <link-entity name="systemuser" from="systemuserid" to="owninguser" alias="aa"> <attribute name="fullname" /> <filter type="and"> <condition attribute="fullname" operator="eq" value="Jeff" /> </filter> </link-entity> </entity> </fetch>
Fetch表达式并不复杂,很容易通过节点的命名猜出它们的用途。Fetch主要的节点及其描述如下表所示:
节点名称描述Entity通过设置该节点的属性name的值来决定查询哪个实体上的记录All-attribute返回当前查询实体的所有属性attribute返回当前查询实体下的某个属性,需要设置该节点的name属性filter过滤约束link-entity相关实体,Fetch表达式能在返回的结果中包含关联实体的字段,和sql中的连接类似。order排序condition约束规则FetchFetch表达式的根节点,通过设置该节点的aggregate属性决定是否使用聚合查询,count属性决定查询返回记录行上限。
在Dynamics CRM 2011 SDK中提供了FetchExpression的Schema文件,如果我们需要制作复杂的Fetch表达式的话,建议引用该Schema文件。
我们来看几个有意思的FetchExpression例子吧:
1. 查询Account实体下存在多少行记录
FetchExpression
<fetch aggregate="true"> <entity name="account"> <attribute name="name" alias="record_count" aggregate="count"/> </entity> </fetch>
Result
<resultset morerecords="0"><result><record_count formattedvalue="7">7</record_count></result></resultset>
2. 查询Account实体下字段Telephone1包含值的记录总数
FetchExpression
<fetch aggregate="true"> <entity name="account"> <attribute name="telephone1" alias="column_count" aggregate="countcolumn"/> </entity> </fetch>
Result
<resultset morerecords="0"><result><column_count formattedvalue="3">3</column_count></result></resultset>
3. 查询Account实体及与其关联的Contact实体,且对account实体进行升序排序,对contact实体进行降序排序
<fetch aggregate="false"> <entity name="account"> <attribute name="name" /> <link-entity from ="contactid" to="primarycontactid" name="contact" alias="c"> <attribute name="firstname"/> <order attribute="firstname" descending="true"/> </link-entity> <order attribute="name" descending="false"/> </entity> </fetch>
Result
<resultset morerecords="0"><result><name>BeyondSoft</name><c.firstname>Hitesh</c.firstname></result><result><name>Wicresoft</name><c.firstname>Jim</c.firstname></result><result><name>Wicresoft</name><c.firstname>Hitesh</c.firstname></result><result><name>Wicresoft</name><c.firstname>Clark</c.firstname></result><result><name>Wicresoft</name><c.firstname>Bob</c.firstname></result></resultset>
4. 查询公司名称以Wic开头,且客户的首字母为J开头的记录数
<fetch aggregate="true"> <entity name="account"> <attribute name="name" aggregate="count" alias="c"/> <link-entity from="contactid" to="primarycontactid" name="contact" alias="c"> <filter type="and"> <condition attribute="fullname" operator="begins-with" value="j"></condition> </filter> </link-entity> <filter type="and"> <condition attribute="name" operator="begins-with" value="wic"></condition> </filter> </entity> </fetch>
Result
<resultset morerecords="0"><result><c formattedvalue="1">1</c></result></resultset>
Linux个人磁盘分区方案(20G)
主机配置I3虚拟机 1G内存 20G硬盘容量
/boot 100M 存放启动Linux系统所必需的文件,包括内核文件、启动菜单配置文件等
/ 2G 系统根目录
/tmp 4G 存放系统运行过程中使用的一些临时文
/swap 2G 交换文件系统(一般为物理内存的1.5到2倍,必须独立分区,物理内存大于8G可以不设这个交换分区)
/usr 4G 这是最宏大地目录,要用到地应用程序和文件都寄存在这个目录下。
/var 4G 存放系统中经常需要变化的一些文件(如系统日志文件、用户邮箱目录等),常常被修改地目录能够放在这个目录下(其中系统地日志文件就在/var/log目录中)
/opt余下的空间 存放第三方软件程序和工具
最近一直在研究mysql 的优化设置,网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据服务器的”状态”进行优化。
mysql> show global status;
可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:
mysql> show variables;
一、慢查询
mysql> show variables like ‘%slow%’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| log_slow_queries | ON |
| slow_launch_time | 2 |
+——————+——-+
mysql> show global status like ‘%slow%’;
+———————+——-+
| Variable_name | Value |
+———————+——-+
| Slow_launch_threads | 0 |
| Slow_queries | 4148 |
+———————+——-+
配置中打开了记录慢查询,执行时间超过2秒的即为慢查询,系统显示有4148个慢查询,你可以分析慢查询日志,找出有问题的SQL语句,慢查询时间 不宜设置过长,否则意义不大,最好在5秒以内,如果你需要微秒级别的慢查询,可以考虑给MySQL打补丁:http://www.percona.com /docs/wiki/release:start,记得找对应的版本。
打开慢查询日志可能会对系统性能有一点点影响,如果你的MySQL是主-从结构,可以考虑打开其中一台从服务器的慢查询日志,这样既可以监控慢查询,对系统性能影响又小。
二、连接数经常会遇见”MySQL: ERROR 1040: Too many connections”的情况,一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是MySQL配 置文件中max_connections值过小:
mysql> show variables like ‘max_connections’;
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 256 |
+—————–+——-+
这台MySQL服务器最大连接数是256,然后查询一下服务器响应的最大连接数:
mysql> show global status like ‘Max_used_connections’;
+———————-+——-+
| Variable_name | Value |
+———————-+——-+
| Max_used_connections | 245 |
+———————-+——-+
MySQL服务器过去的最大连接数是245,没有达到服务器连接数上限256,应该没有出现1040错误,比较理想的设置是:
Max_used_connections / max_connections * 100% ≈ 85%
最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。
三、Key_buffer_sizekey_buffer_size是对MyISAM表性能影响最大的一个参数,下面一台以MyISAM为主要存储引擎服务器的配置:
mysql> show variables like ‘key_buffer_size’;
+—————–+————+
| Variable_name | Value |
+—————–+————+
| key_buffer_size | 536870912 |
+—————–+————+
分配了512MB内存给key_buffer_size,我们再看一下key_buffer_size的使用情况:
mysql> show global status like ‘key_read%’;
+————————+————-+
| Variable_name | Value |
+————————+————-+
| Key_read_requests | 27813678764 |
| Key_reads | 6798830 |
+————————+————-+
一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:
key_cache_miss_rate = Key_reads / Key_read_requests * 100%
比如上面的数据,key_cache_miss_rate为0.0244%,4000个索引读取请求才有一个直接读硬盘,已经很BT 了,key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),如果key_cache_miss_rate在 0.01%以下的话,key_buffer_size分配的过多,可以适当减少。
MySQL服务器还提供了key_blocks_*参数:
mysql> show global status like ‘key_blocks_u%’;
+————————+————-+
| Variable_name | Value |
+————————+————-+
| Key_blocks_unused | 0 |
| Key_blocks_used | 413543 |
+————————+————-+
Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数, 比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置:
Key_blocks_used / (Ke