在 C# 中优化多个 SQL 选择
Posted
技术标签:
【中文标题】在 C# 中优化多个 SQL 选择【英文标题】:Optimize multiple SQL Selects in C# 【发布时间】:2016-04-08 10:17:43 【问题描述】:我有一个程序的一部分,它必须根据不同的查询显示来自多个表的数据。到目前为止,它看起来像这样:(请记住,每个后续 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
【问题讨论】:
当您说更改数据库是不可能的,我假设您的意思是修改表结构。你能创建新的索引吗? @Brad,不幸的是,我们无法以任何方式更改数据库,因为同一产品的旧版本也在数据库上运行,并且期望一切都保持原样。一般来说,那些没有重复的字段被添加为主键。 【参考方案1】:构造查询字符串并执行它们是有开销的。在运行多个类似查询时,您希望确保它们被编译一次,然后重新使用执行计划。
但是,最好的方法可能是创建一个返回多个列的查询。天真地,这看起来像:
select . . .
from a join
b
on . . . join
c
on . . . join
. . .
但是,join
s 可能是 left join
s。如果您沿着可能产生笛卡尔积的不同维度进行连接,则查询可能会更复杂。
关键是SQL查询会优化数据库内部的查询。这(通常)比构建多个不同的查询更有效。
【讨论】:
感谢您抽出宝贵时间回复,戈登。但是,在尝试仅对前两个表进行内部连接时,在处理其余表之前,结果是 DBMS 本身内部的查询时间为 1 秒,这在 C# 中约为 1.5 秒。可能是 DBMS 实际上首先创建了所有连接,然后花时间实际过滤结果。我遇到的另一个问题是某些字段可能为空,我在程序中对其进行了过滤,但无法在查询中进行。以上是关于在 C# 中优化多个 SQL 选择的主要内容,如果未能解决你的问题,请参考以下文章