博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDBC获取ResultSet的MetaData
阅读量:7113 次
发布时间:2019-06-28

本文共 914 字,大约阅读时间需要 3 分钟。

数据库为sqlserver, driver是jtds。

需要判断某个字段是否在某个表中存在,一般做法:

1. 查询出0条或多条记录,即一个ResultSet。如,ResultSet rs。

2. 即可以获取到MetaData对象: ResultSetMetaData metaData = rs.getMetaData();

3. ResultSetMetaData对象里包含所有字段信息,逐个判断就可以了。

例:http://msdn.microsoft.com/en-us/library/ms378557.aspx

 

关键在于:

使用的SQL语句, SELECT TOP 10 * FROM Person.Contact,查出了10条记录。如果只是需要获取MetaData,获取出记录就是多余的。

把SQL改成: SELECT * FROM Person.Contact where 1=2。这个语句没有查出任何记录,只获取MetaData。

这样看上去似乎完美了。 

 

但是 SELECT * FROM Person.Contact where 1=2 运行效率在这个表有大量记录的时候是不高的,因为进行了全表扫描。

以下是SQL Manager 2011 for SQL Server的分析结果:

JDBC get metadata

由此可见,如果这个表的记录数量级很大的话,执行这条语句的成本是不低的。

 

可选方案:

1. 避免使用 where 1=2 这样的条件。同事说,现在资深的DBA对这样的语句极为反感,估计是高成本和看不出用意有关。

2. 尽量使用有索引的字段。比如可以利用ID一般不会小于0这个特性,where id < 0 来过虑掉所有记录。不过这要根据不同的表结构来写SQL语句。

3. 我现在碰到的表没有主键,没有索引。。只有使用where  1=2 这个条件。

 

在网上搜了一把,也还没有搜到其他高效的方法。

2012-05-23 ,现在找到了新的方法,用DatabaseMetaData: 

转载于:https://www.cnblogs.com/lyhtbc/archive/2012/03/15/jdbc_get_metadata.html

你可能感兴趣的文章
JavaScript 工厂模式和订阅模式
查看>>
阮一峰老师微博上的关于js作用域的一道题
查看>>
关于两个程序员的寓言故事
查看>>
Docker 构建统一的前端开发环境
查看>>
一文让你了解大数据时代,你的真实处境
查看>>
Problems at works
查看>>
Dell服务器系统安装后无法正常进入系统
查看>>
深入理解asp.net里的HttpModule机制
查看>>
java基础学习_常用类03_StringBuffer类、数组高级和Arrays类、Integer类和Character类_day13总结...
查看>>
Asp.net MVC Session过期异常的处理
查看>>
python ThreadPoolExecutor线程池使用
查看>>
IPTABLES 规则(Rules)
查看>>
关于URL编码
查看>>
深度学习的可解释性研究(一):让模型「说人话」
查看>>
QT5提示can not find -lGL的解决方法
查看>>
Silverlight/Windows8/WPF/WP7/HTML5周学习导读(9月17日-9月23日)
查看>>
Tap-Ahead:让移动搜索更加便捷的解决之道
查看>>
Windows Server2016 Hyper-v Cluster部署
查看>>
juniper路由器配置
查看>>
jQuery一点一滴系列教程(第三点)
查看>>