phone1


PhoneRecordActivity


import java.util.ArrayList;


public class PhoneRecordActivity extends Activity implements View.OnClickListener{


private static final String TAG = "PhoneRecordActivity";
private Button addManualBtn;
private Button addContactsBtn;
private DataOpenHelper dataHelper;
private ListView persons;
private List<Map<String, Object>> list;
private SimpleAdapter adapter;

private static final int REFRESH_MSG = 1;

private static final int EDIT = 0;
private static final int DELETE = 1;

private static final int REQUEST_ADD_MANUAL= 1;
private static final int REQUEST_ADD_CONTACT= 3;
private static final int REQUEST_EDIT= 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main_list);
init();


}
private void init(){
addManualBtn = (Button)findViewById(R.id.add_manual);
addContactsBtn = (Button)findViewById(R.id.add_contacts);
dataHelper = new DataOpenHelper(this);
persons = (ListView)findViewById(R.id.persons);
list = initPersons();
adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2
, new String[]{"NAME", "PHONE"}, new int[]{android.R.id.text1, android.R.id.text2});
persons.setAdapter(adapter);
addManualBtn.setOnClickListener(listener);
addContactsBtn.setOnClickListener(listener);
persons.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {


public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {


View child = parent.getChildAt(position);

return false;
}

});
persons.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {



public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("操作");
menu.add(0, EDIT, EDIT, "修改");
menu.add(0, DELETE, DELETE, "删除");
}
});



}
OnClickListener listener = new View.OnClickListener() {

public void onClick(View v) {
switch(v.getId()){
case R.id.add_manual:
Intent intent = new Intent(PhoneRecordActivity.this, AddActivity.class);
startActivityForResult(intent, REQUEST_ADD_MANUAL);
break;
case R.id.add_contacts:
Intent i = new Intent(PhoneRecordActivity.this, ContactsActivity.class);
startActivityForResult(i, REQUEST_ADD_CONTACT);
break;
default:
break;

}
源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO)的LSTM分类预测研究(Matlab代码实现)内容概要:本文研究了一种基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO),并将其应用于LSTM神经网络的分类预测中,通过Matlab代码实现。该方法结合遗传算法的全局搜索能力与改进的多群粒子群算法的局部优化特性,提升LSTM模型在分类任务中的性能表现,尤其适用于复杂非线性系统的预测问题。文中详细阐述了算法的设计思路、优化机制及在LSTM参数优化中的具体应用,并提供了可复现的Matlab代码,属于SCI级别研究成果的复现与拓展。; 适合人群:具备一定机器学习和优化算法基础,熟悉Matlab编程,从事智能算法、时间序列预测或分类模型研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①提升LSTM在分类任务中的准确性与收敛速度;②研究混合智能优化算法(如GA与PSO结合)在神经网络超参数优化中的应用;③实现高精度分类预测模型,适用于电力系统故障诊断、电池健康状态识别等领域; 阅读建议:建议读者结合Matlab代码逐步调试运行,理解GA-HIDMSPSO算法的实现细节,重点关注种群划分、异构策略设计及与LSTM的集成方式,同时可扩展至其他深度学习模型的参数优化任务中进行对比实验。
<think> 我们正在处理的问题是:在使用 `EXPLAIN (ANALYZE, ADAPTCOST)` 执行包含 `/*+ rows(CustomerPhones #300003) */` 提示的 SQL 语句时,该行数提示(rows hint)似乎失效了。具体语句是: ```sql select /*+ rows(CustomerPhones #300003) */ * from CustomerPhones unpivot (Phone FOR Phones IN (Phone1, Phone2, Phone3)) up where CustomerID>1; ``` ### 问题分析 1. **什么是行数提示(rows hint)?** - 在 PostgreSQL 中,行数提示是一种通过注释语法(`/*+ ... */`)向优化器提供关于预期行数的额外信息的方式。它通常用于在优化器的基数估计不准确时手动调整。例如,`/*+ rows(CustomerPhones #300003) */` 表示我们期望表 `CustomerPhones` 在过滤后大约有 300,003 行。 2. **为什么提示会失效?** - 提示失效可能有多种原因: - **语法错误**:提示的语法可能不正确,导致优化器忽略它。 - **提示位置**:提示必须紧跟在 `SELECT` 关键字之后,否则可能被忽略。 - **复杂查询结构**:在涉及 `UNPIVOT` 操作的查询中,提示可能无法直接应用于基表,因为优化器会重写查询。 - **优化器限制**:PostgreSQL 对提示的支持不如 Oracle 那样全面,某些提示可能不被支持。 3. **特定于 `UNPIVOT` 的问题:** - `UNPIVOT` 操作会将多个列(这里是 `Phone1`, `Phone2`, `Phone3`)转换为行,这可能会导致优化器难以准确估计行数。在这种情况下,优化器可能会忽略我们提供的提示,因为它无法将提示应用到转换后的结果上。 ### 解决方案 #### 步骤 1:验证提示语法 确保提示语法正确。PostgreSQL 中行数提示的标准语法是: ```sql /*+ rows(table_name #expected_rows) */ ``` 其中 `table_name` 是表名或别名,`#expected_rows` 是期望的行数(整数,不加逗号)。在我们的例子中,`300003` 应该写作 `300003`(不要写成 `300,003`)。 #### 步骤 2:确保提示位置正确 提示必须紧跟在 `SELECT` 关键字之后: ```sql SELECT /*+ rows(CustomerPhones #300003) */ ... ``` #### 步骤 3:在 `UNPIVOT` 操作中调整提示目标 由于 `UNPIVOT` 操作会生成一个派生表,原始表名 `CustomerPhones` 可能不再直接可见。尝试使用别名: ```sql SELECT /*+ rows(up #300003) */ * FROM CustomerPhones UNPIVOT (Phone FOR Phones IN (Phone1, Phone2, Phone3)) up -- 这里给UNPIVOT结果起了别名up WHERE CustomerID > 1; ``` 或者,如果优化器仍然无法识别,尝试将提示放在子查询中: ```sql SELECT /*+ rows(sub #300003) */ * FROM ( SELECT * FROM CustomerPhones UNPIVOT (Phone FOR Phones IN (Phone1, Phone2, Phone3)) ) AS sub -- 子查询别名 WHERE CustomerID > 1; ``` #### 步骤 4:使用 `SET` 强制行数 如果提示仍然不起作用,我们可以尝试通过设置优化器参数来强制行数估计: ```sql -- 首先获取查询中底层扫描的计划节点ID(通过EXPLAIN查看) EXPLAIN (ANALYZE, ADAPTCOST) SELECT * FROM ...; -- 观察输出中Seq Scan或Index Scan的节点标识 -- 然后使用pg_hint_plan扩展强制行数 /*+ Set(rows #300003) */ ``` 但这需要安装 `pg_hint_plan` 扩展,并且需要知道具体的计划节点ID。 #### 步骤 5:检查 `ADAPTCOST` 的影响 `ADAPTCOST` 可能会覆盖我们的提示,因为它会根据实际执行结果动态调整成本估算。如果启用了 `ADAPTCOST`,优化器可能会优先使用它调整后的行数估计,而不是我们的提示。我们可以尝试禁用 `ADAPTCOST`: ```sql SET pg_adaptive_cost.enabled = off; EXPLAIN ANALYZE SELECT /*+ rows(CustomerPhones #300003) */ * FROM ...; ``` #### 步骤 6:使用临时表或CTE 如果以上方法都失败,可以将 `UNPIVOT` 部分放入临时表或CTE中,然后对临时表应用提示: ```sql WITH Unpivoted AS ( SELECT /*+ rows(CustomerPhones #300003) */ * FROM CustomerPhones UNPIVOT (Phone FOR Phones IN (Phone1, Phone2, Phone3)) ) SELECT * FROM Unpivoted WHERE CustomerID > 1; ``` 注意:CTE中的提示可能同样会被忽略,因此可能需要使用临时表: ```sql CREATE TEMP TABLE TempUnpivot AS SELECT /*+ rows(CustomerPhones #300003) */ * FROM CustomerPhones UNPIVOT (Phone FOR Phones IN (Phone1, Phone2, Phone3)); EXPLAIN (ANALYZE, ADAPTCOST) SELECT * FROM TempUnpivot WHERE CustomerID > 1; ``` ### 最终建议方案 1. **首选方法**:调整提示位置,使用UNPIVOT结果的别名(步骤3)。 2. **备选方法**:使用CTE或临时表(步骤6),并确保在临时表创建时使用提示。 3. **验证**:通过比较 `EXPLAIN` 输出中的 `rows` 估计值确认提示是否生效。 ### 相关问题 1. 如何在 PostgreSQL 中安装和使用 `pg_hint_plan` 扩展? 2. 除了行数提示,PostgreSQL 还有哪些优化器提示? 3. `UNPIVOT` 操作在 PostgreSQL 中是如何实现的?它会影响查询性能吗? 4. `ADAPTCOST` 如何与优化器提示交互? > 提示:PostgreSQL 的提示支持依赖于扩展(如 `pg_hint_plan`),核心SQL语法中并不原生支持提示。因此,如果上述方法无效,可能需要考虑安装 `pg_hint_plan`[^1]。 </think> ### 问题分析与解决方案 您在 `UNPIVOT` 查询中使用行数提示 `/*+ rows(CustomerPhones #300003) */` 时遇到失效问题,核心原因在于 **优化器的基数估算被 `UNPIVOT` 操作破坏**,导致提示无法生效。以下是逐步解决方案: --- ### 一、问题根源 1. **`UNPIVOT` 的基数变化** `UNPIVOT` 操作会将 `Phone1, Phone2, Phone3` 三列转换为多行(每行一个电话),这会**大幅改变行数基数**。优化器无法将此变化与您的行数提示 `#300003` 关联。 2. **提示作用域错误** 提示 `rows(CustomerPhones #300003)` 作用于**基表**,但优化器在 `UNPIVOT` 后处理的是**派生表**(别名 `up`),导致提示被忽略。 3. **`ADAPTCOST` 的干扰** 当启用 `ADAPTCOST` 时,优化器会基于实际执行结果动态调整成本模型[^1],可能覆盖手动提示。 --- ### 二、解决方案 #### 方法 1:将提示作用于派生表(推荐) ```sql EXPLAIN (ANALYZE, ADAPTCOST) SELECT /*+ rows(up #300003) */ * -- 将提示目标改为UNPIVOT后的别名 FROM CustomerPhones UNPIVOT (Phone FOR Phones IN (Phone1, Phone2, Phone3)) AS up WHERE CustomerID > 1; ``` **原理**:直接提示优化器 `UNPIVOT` 结果集 (`up`) 的期望行数。 #### 方法 2:通过子查询隔离提示 ```sql EXPLAIN (ANALYZE, ADAPTCOST) SELECT * FROM ( SELECT /*+ rows(CustomerPhones #300003) */ * FROM CustomerPhones ) AS t -- 先在子查询中固定基表行数 UNPIVOT (Phone FOR Phones IN (Phone1, Phone2, Phone3)) AS up WHERE CustomerID > 1; ``` **原理**:子查询中先锁定基表行数估计,避免 `UNPIVOT` 干扰。 #### 方法 3:使用 `pg_hint_plan` 扩展(精确控制) ```sql LOAD 'pg_hint_plan'; -- 加载扩展 /*+ Rows(up #300003) */ EXPLAIN (ANALYZE, ADAPTCOST) SELECT * FROM CustomerPhones UNPIVOT (Phone FOR Phones IN (Phone1, Phone2, Phone3)) AS up WHERE CustomerID > 1; ``` **优势**:专业提示扩展,支持复杂场景[^1]。 --- ### 三、验证提示生效 检查 `EXPLAIN` 输出中的基数估算值: ```sql Seq Scan on CustomerPhones (cost=0.00..X rows=300003) -- 此处应为300003 Filter: (CustomerID > 1) ``` 若 `rows=300003` 说明提示生效;若为其他值(如 `rows=N`),则需检查语法或作用域。 --- ### 四、ADAPTCOST 注意事项 当同时使用 ``ADAPTCOST` 时: 1. **首次执行可能无效** 因 `ADAPTCOST` 需收集实际执行数据反馈给优化器,首次执行可能不遵循提示。 2. **二次执行验证** 首次执行后,优化器会调整模型,再次执行通常能正确响应提示: ```sql -- 第一次执行(收集数据) EXPLAIN (ANALYZE, ADAPTCOST) ... -- 第二次执行(应用调整) EXPLAIN (ANALYZE, ADAPTCOST) ... ``` --- ### 五、扩展建议 1. **更新统计信息** 若基数估算持续偏差,手动更新统计信息: ```sql ANALYZE CustomerPhones; -- 刷新表的统计信息 ``` 2. **检查数据分布** 确认 `CustomerID > 1` 的实际行数是否接近 300,003: ```sql SELECT COUNT(*) FROM CustomerPhones WHERE CustomerID > 1; ``` --- ### 相关问题 1. 如何在 PostgreSQL 中强制使用特定的连接顺序(如 `Nested Loop`)? 2. 当查询包含 `CTE` 时,行数提示失效该如何处理? 3. `pg_hint_plan` 扩展支持哪些类型的优化器提示? 4. `ADAPTCOST` 如何影响索引选择策略? > 通过将提示作用于 `UNPIVOT` 结果别名或使用子查询隔离,可解决复杂操作导致的提示失效问题。对于生产环境,建议结合 `pg_hint_plan` 扩展实现精准控制[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值