Redian新闻
>
如何在数据库中进行复杂查询, 但不把中间结果放到程序内存
avatar
如何在数据库中进行复杂查询, 但不把中间结果放到程序内存# Database - 数据库
s*n
1
我是数据库新手, 请大家指点, 谢谢!
我有个小项目, 需要经常扫描数据库, 但是只对其中的一个表做一点小的update
我的查询是针对多个表的, 比如说查到了一些结果,
然后对这些结果再查询其他数据表...
最后做一个update
我可以在程序内存中保留中间查询结果, 然后再处理.
但是因为扫描的东西可能会很多, 频率也会很高, 所以想不要进行内存的操作
直接在数据库中实现. 不知道应该如何写这个样的语句?
或者说数据库的什么机制就可以实现这个的功能?
我数据库用的不多, 只会简单的sql. 但是如果知道了要去用什么实现, 就有方向了.
谢谢!
avatar
B*g
2
1. 首先,你得告诉我们你用啥数据库
2. google "store procedure"

了.

【在 s******n 的大作中提到】
: 我是数据库新手, 请大家指点, 谢谢!
: 我有个小项目, 需要经常扫描数据库, 但是只对其中的一个表做一点小的update
: 我的查询是针对多个表的, 比如说查到了一些结果,
: 然后对这些结果再查询其他数据表...
: 最后做一个update
: 我可以在程序内存中保留中间查询结果, 然后再处理.
: 但是因为扫描的东西可能会很多, 频率也会很高, 所以想不要进行内存的操作
: 直接在数据库中实现. 不知道应该如何写这个样的语句?
: 或者说数据库的什么机制就可以实现这个的功能?
: 我数据库用的不多, 只会简单的sql. 但是如果知道了要去用什么实现, 就有方向了.

avatar
j*n
3
感觉你这个也就一个 UPDATE 带一串比较复杂的QUERY CONDITIONS 就搞定了。
avatar
n*6
4
My general comments. Please feel free to give me some comments.
How often do you do the query? once per minute? 10 times per hour? or 20
times per day?
How long does the query run? 3 seconds? 30 seconds? or 3 minutes?
If your query run for 3 seconds or less per time, and even once per minute,
just do as simple as you can do. Simple is good. :)

了.

【在 s******n 的大作中提到】
: 我是数据库新手, 请大家指点, 谢谢!
: 我有个小项目, 需要经常扫描数据库, 但是只对其中的一个表做一点小的update
: 我的查询是针对多个表的, 比如说查到了一些结果,
: 然后对这些结果再查询其他数据表...
: 最后做一个update
: 我可以在程序内存中保留中间查询结果, 然后再处理.
: 但是因为扫描的东西可能会很多, 频率也会很高, 所以想不要进行内存的操作
: 直接在数据库中实现. 不知道应该如何写这个样的语句?
: 或者说数据库的什么机制就可以实现这个的功能?
: 我数据库用的不多, 只会简单的sql. 但是如果知道了要去用什么实现, 就有方向了.

avatar
s*n
5
谢谢啊!
要用的数据库最大可能是sql server, 也有可能是oracle, 这个希望两者都可以
好,我去看看store procedure

【在 B*****g 的大作中提到】
: 1. 首先,你得告诉我们你用啥数据库
: 2. google "store procedure"
:
: 了.

avatar
s*n
6
没错, 就是一个update
这个query应该是相当复杂的, (当然只是根据我自己接触定义的)。
比如说我要查询的表的名字就要通过查询其他的表来得到
其实通过程序也可以实现。
但是现在想直接在数据库上面实现, 然后程序只要执行这些语句就行了。
我想也许要建立一些临时表格放一些中间结果。

【在 j*****n 的大作中提到】
: 感觉你这个也就一个 UPDATE 带一串比较复杂的QUERY CONDITIONS 就搞定了。
avatar
s*n
7

The frequency can be configured, for more accurate results, more often.
I would like to say 10 times per hour
The run time query depends on the size of some table, so might be very long,
or very short (seems said nothing...)
Thanks!
,

【在 n********6 的大作中提到】
: My general comments. Please feel free to give me some comments.
: How often do you do the query? once per minute? 10 times per hour? or 20
: times per day?
: How long does the query run? 3 seconds? 30 seconds? or 3 minutes?
: If your query run for 3 seconds or less per time, and even once per minute,
: just do as simple as you can do. Simple is good. :)
:
: 了.

avatar
s*n
8
我补充一个简单的流程吧, 谢谢大家的意见。
第一步:
query on T1, T2 得到下面要查询的一些表的名字
对每个要查询的表, 找出表中满足条件的记录 r1, r2... rn,
把这些记录中放到自己建的一个表 T
下面是另外一些对T的处理:
第二步:
对于T的每条记录,
判断是否还是valid?
是valid, 是否需要update?
是要update, 然后根据一些条件去update另外一个表。

了.

【在 s******n 的大作中提到】
: 我是数据库新手, 请大家指点, 谢谢!
: 我有个小项目, 需要经常扫描数据库, 但是只对其中的一个表做一点小的update
: 我的查询是针对多个表的, 比如说查到了一些结果,
: 然后对这些结果再查询其他数据表...
: 最后做一个update
: 我可以在程序内存中保留中间查询结果, 然后再处理.
: 但是因为扫描的东西可能会很多, 频率也会很高, 所以想不要进行内存的操作
: 直接在数据库中实现. 不知道应该如何写这个样的语句?
: 或者说数据库的什么机制就可以实现这个的功能?
: 我数据库用的不多, 只会简单的sql. 但是如果知道了要去用什么实现, 就有方向了.

avatar
j*n
9
some key words you may need:
temp table
dynamic sql
sure you need a stored procedure

【在 s******n 的大作中提到】
: 我补充一个简单的流程吧, 谢谢大家的意见。
: 第一步:
: query on T1, T2 得到下面要查询的一些表的名字
: 对每个要查询的表, 找出表中满足条件的记录 r1, r2... rn,
: 把这些记录中放到自己建的一个表 T
: 下面是另外一些对T的处理:
: 第二步:
: 对于T的每条记录,
: 判断是否还是valid?
: 是valid, 是否需要update?

avatar
s*n
10
我写了下面的一段:
declare @name nvarchar(30)
declare @no int
declare curse insensitive cursor for select tabname from tabs
open curse
fetch next from curse into @name
while @@fetch_status = 0
begin
declare sub_curse insensitive cursor for
select no from tab T1 join @name T2 on T1.a = T2.a and T1.b = T2.b
open sub_curse
fetch next from sub_curse into @no
while @@fetch_status = 0
begin
--print @no
fetch next from sub_curse into @no
end
close sub_curse
deallo

【在 j*****n 的大作中提到】
: some key words you may need:
: temp table
: dynamic sql
: sure you need a stored procedure

avatar
j*n
11
//faint, dynamic sql 不是你这么用的。
查查 sp_executesql 是怎么用的吧。
avatar
A*L
12
temptable?

了.

【在 s******n 的大作中提到】
: 我是数据库新手, 请大家指点, 谢谢!
: 我有个小项目, 需要经常扫描数据库, 但是只对其中的一个表做一点小的update
: 我的查询是针对多个表的, 比如说查到了一些结果,
: 然后对这些结果再查询其他数据表...
: 最后做一个update
: 我可以在程序内存中保留中间查询结果, 然后再处理.
: 但是因为扫描的东西可能会很多, 频率也会很高, 所以想不要进行内存的操作
: 直接在数据库中实现. 不知道应该如何写这个样的语句?
: 或者说数据库的什么机制就可以实现这个的功能?
: 我数据库用的不多, 只会简单的sql. 但是如果知道了要去用什么实现, 就有方向了.

avatar
n*6
13
Why do you suggest dynamic sql?
Why not make it simple and avoid using dynamic sql?

【在 j*****n 的大作中提到】
: //faint, dynamic sql 不是你这么用的。
: 查查 sp_executesql 是怎么用的吧。

avatar
n*6
14
Good coding logic and writing style for self-learners.
Now you are doing debug.
Try to separate code into small units and test it. Do not test all the code
together.
For example, test the query first, then test the update.

【在 s******n 的大作中提到】
: 我写了下面的一段:
: declare @name nvarchar(30)
: declare @no int
: declare curse insensitive cursor for select tabname from tabs
: open curse
: fetch next from curse into @name
: while @@fetch_status = 0
: begin
: declare sub_curse insensitive cursor for
: select no from tab T1 join @name T2 on T1.a = T2.a and T1.b = T2.b

avatar
j*n
15
here is the reason...
一步:
query on T1, T2 得到下面要查询的一些表的名字

【在 n********6 的大作中提到】
: Why do you suggest dynamic sql?
: Why not make it simple and avoid using dynamic sql?

avatar
B*g
16
俺门连column name都可能要查。

【在 j*****n 的大作中提到】
: here is the reason...
: 一步:
: query on T1, T2 得到下面要查询的一些表的名字

avatar
B*g
17
我竟然也看懂了, 真是宝刀不老

【在 s******n 的大作中提到】
: 我写了下面的一段:
: declare @name nvarchar(30)
: declare @no int
: declare curse insensitive cursor for select tabname from tabs
: open curse
: fetch next from curse into @name
: while @@fetch_status = 0
: begin
: declare sub_curse insensitive cursor for
: select no from tab T1 join @name T2 on T1.a = T2.a and T1.b = T2.b

avatar
n*6
18
Note: Following logic do not have dynamic sql.
Advantage: Do not need to learn dynamic sql. Save time. You already know how to use cursor. Just use cursor to solve the problem.
Disadvantage: Loose the opportunity to learn dynamic sql.
第一步:
query on T1, T2 得到下面要查询的一些表的名字
对每个要查询的表, 找出表中满足条件的记录 r1, r2... rn,
把这些记录中放到自己建的一个表 T
SELECT ...
INTO ##TABLENAME -- Put all the tablesnames into a temptable.
FROM T1 JOIN T2 ON ...
WHERE ...
avatar
j*n
19
你跟LZ 范的错误是同样地...

how to use cursor. Just use cursor to solve the problem.

【在 n********6 的大作中提到】
: Note: Following logic do not have dynamic sql.
: Advantage: Do not need to learn dynamic sql. Save time. You already know how to use cursor. Just use cursor to solve the problem.
: Disadvantage: Loose the opportunity to learn dynamic sql.
: 第一步:
: query on T1, T2 得到下面要查询的一些表的名字
: 对每个要查询的表, 找出表中满足条件的记录 r1, r2... rn,
: 把这些记录中放到自己建的一个表 T
: SELECT ...
: INTO ##TABLENAME -- Put all the tablesnames into a temptable.
: FROM T1 JOIN T2 ON ...

avatar
j*n
20
an example:
declar @sqlstr nvarchar(4000)
declar @tableName nvarchar(20)
set @tableName = 'theTable'
select @sqlstr = 'SELECT * FROM ' + @tableName
sp_execsql @sqlstr
avatar
w*r
21
create a temp table to store the intermediate result and use the content of
table to direct the update strategy. store proc is the natural choice,
however on Teradata, store proc is SLOW

【在 j*****n 的大作中提到】
: an example:
: declar @sqlstr nvarchar(4000)
: declar @tableName nvarchar(20)
: set @tableName = 'theTable'
: select @sqlstr = 'SELECT * FROM ' + @tableName
: sp_execsql @sqlstr

avatar
B*g
22
所以只有sql sever developer,没有 teradata developer

of

【在 w*r 的大作中提到】
: create a temp table to store the intermediate result and use the content of
: table to direct the update strategy. store proc is the natural choice,
: however on Teradata, store proc is SLOW

avatar
s*n
23
谢谢大家啊, 我就不一一谢过了。
我在埋头苦学中, 所以没来看。
终于用dynamic sql 把我要实现的东西实现出来了, 谢谢大家的指点。
不过我现在也开始面临performance问题了。 这些query执行的频率还是挺高的, 而且我
实际需要的还比我写在这里的要复杂不少。
这个stored proc相当慢?

of

【在 w*r 的大作中提到】
: create a temp table to store the intermediate result and use the content of
: table to direct the update strategy. store proc is the natural choice,
: however on Teradata, store proc is SLOW

avatar
s*n
24
谢谢你写得这么详细。
我也用到了temp table, 跟你这个思路差不多
但是我实际的query还是比这个要复杂不少, 所以我还是用了几个stored proc.

how to use cursor. Just use cursor to solve the problem.

【在 n********6 的大作中提到】
: Note: Following logic do not have dynamic sql.
: Advantage: Do not need to learn dynamic sql. Save time. You already know how to use cursor. Just use cursor to solve the problem.
: Disadvantage: Loose the opportunity to learn dynamic sql.
: 第一步:
: query on T1, T2 得到下面要查询的一些表的名字
: 对每个要查询的表, 找出表中满足条件的记录 r1, r2... rn,
: 把这些记录中放到自己建的一个表 T
: SELECT ...
: INTO ##TABLENAME -- Put all the tablesnames into a temptable.
: FROM T1 JOIN T2 ON ...

avatar
w*e
25
要是执行频率很高, dynamic sql不是好的选择,
不过在SQL 2005里有个statement level的option(recompile), 你可以试试

且我

【在 s******n 的大作中提到】
: 谢谢大家啊, 我就不一一谢过了。
: 我在埋头苦学中, 所以没来看。
: 终于用dynamic sql 把我要实现的东西实现出来了, 谢谢大家的指点。
: 不过我现在也开始面临performance问题了。 这些query执行的频率还是挺高的, 而且我
: 实际需要的还比我写在这里的要复杂不少。
: 这个stored proc相当慢?
:
: of

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。