我有一个程序的一部分,它必须根据不同的查询显示来自多个表的数据。到目前为止它看起来像这样:(请记住,每个后续的SELECT都是基于我们从A获得的东西)
SELECT * FROM TABLE A WHERE ID = ...
SELECT [8 fields] FROM TABLE B WHERE ...
SELECT [5 fields] FROM TABLE C WHERE ...
SELECT [1 field] FROM TABLE D WHERE ...
SELECT [1 field] FROM TABLE E WHERE ...
SELECT [1 field] FROM TABLE F WHERE ...
SELECT [1 field] FROM TABLE G WHERE ...
SELECT [1 field] FROM TABLE H WHERE ...
SELECT [2 fields] FROM TABLE I WHERE ...
之后,我会获取结果并创建不同的对象或将它们放在不同的字段中。 事情是,在点击按钮和显示窗口之间,我有大约2秒的延迟。 请记住,这是一个非常大的数据库,拥有数百万条记录。不幸的是,更改数据库是不可能的。 我只通过主键搜索,我无法限制搜索甚至更多。
连接从一开始就打开,我不会在每个语句后关闭/重新打开它。 仅加入表A和表B需要比两个不同的选择长很多,最多1.5秒,而运行顺序选择则下降到约300毫秒。 鉴于第一个查询在DBMS中的执行时间大约为53毫秒,我仍然觉得很长一段时间。
我在C#,Net Framework 4中使用ODBC驱动程序。数据库本身是一个DB2,但是,使用DB2本机驱动程序给我们带来了太多问题,IBM对它没有多大帮助。
此外,每当我只选择几个字段时,我只使用那些字段创建所需的对象,并将其余字段保留为默认值。
有什么方法可以改善这个吗? 先感谢您, 安德烈
编辑:诊断工具说明了以下内容:
--Two queries in another part of the program, we can ignore these, as they are not usually there-- 0.31 s
First query - 0.75 s
Second query - 0.87s
Third query - 0.95s
Fourth query - 0.99s
Fifth query - 1.00s
Sixth query - 1.04s
Seventh query - 1.08s
Eighth query - 1.10s
Ninth query - 1.12s
Program output - 1.81s
答案 0 :(得分:0)
构造查询字符串并执行它们会产生开销。运行多个类似的查询时,您希望确保它们被编译一次,然后重新使用执行计划。
但是,最好的方法是创建一个返回多列的查询。天真的,这看起来像:
select . . .
from a join
b
on . . . join
c
on . . . join
. . .
但是,join
可能是left join
s。如果要加入可能产生笛卡尔积的不同维度,查询可能会更复杂。
关键是SQL查询将优化数据库中的查询 。这(通常)比构建多个不同的查询更有效。