佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1939|回复: 11

想请教有任何方法提高这种类型 SQL Queries 性能吗? 更新问题

[复制链接]
发表于 11-11-2013 02:56 PM | 显示全部楼层 |阅读模式
简单来说我要用到3个table
顾客有会员卡每年更新一次,所以一个顾客会有几张会员卡

1.顾客
customer_id,name,ic......等等

2.会员
member_id,customer_id,expiried_date...等等

3.交易
transaction_id,member_id,customer_id,product_id...等等


如果说我要一份report来list out 所有顾客的名,过去现在的会员卡,和他们用会员卡买过什么东西 ?
想请教类似这种情况应该用怎样的Queries ? 有办法一个Queries 做到吗?

我目前的做法是拿全部顾客的id和名(1个Queries )
再用顾客的id去会员和交易的table  (2个Queries )
共3个Queries
我在试验的db里有80多位顾客加上generate report都要用上1-2分钟了...有点接受不到咯...

在此先谢谢各位的帮助与建议


更新问题!
也许上面的例子比较难明白

我换另一个
比方说我要generate summary monthly sales report...
不用多我有20个产品就好, 用类似以下的表格为templete...
就是说我要知道一天某个产品卖了几个然后当天的总数...
所以我需要怎样做呢?



我现在的做法是

for(dateOfMonth){
select A,B,C,.......(20个)
from(select  count(product a) as A from sales where date = 'date') a
CROSS JOIN (select  count(product b) as B from sales where date = 'date') b
CROSS JOIN (select  count(product c) as C from sales where date = 'date') c
}

就是说我有20产品 X 30天 的话 共 600 个 select  count










本帖最后由 pohlee 于 16-1-2014 05:38 PM 编辑

回复

使用道具 举报


ADVERTISEMENT

发表于 13-11-2013 09:22 AM | 显示全部楼层
建议顾客购买更快的电脑和装备更多的RAM。

我编写的成绩册系统,在运算全校学生成绩时,大型学校(800+学生,每个学生有32个科目,共有7次考试运算),在我的laptop(i5 CPU, 6GB RAM)也不过耗时约2分钟罢了。我并不是全用SQL Command,而是从MySQL Server提取数据,然后用C++运算,只有在大量Update数据时才采用SQL command。重点在于适当的时候采用适当的运算方式,别纯粹为了SQL而SQL,结果写出十分复杂的Statement,导致SQL Server 要Parse你的Statement都得耗费大量的时间。
回复

使用道具 举报

发表于 13-11-2013 03:09 PM | 显示全部楼层
试下用join table的方法
select * from customer c left join membership m on c.customer_id = m.customer_id left join transaction t on m.member_id = t.member_id
希望行的通
回复

使用道具 举报

发表于 13-11-2013 05:42 PM | 显示全部楼层
请问你是用着什么dbms?
80多个records不可能需要1-2分钟。
我觉得慢的原因是出在你report的那边吧?你有试过直接在dbms里直接用query找出records吗?

Anyway, 如果你要用一个query找出所有有关连的records,你可以尝试用inner join

SELECT c.*, m.*, t.*
FROM tbl_Customer c INNER JOIN
tbl_Member m ON c.customer_id = m.customer_id INNER JOIN
tbl_Transaction t ON c.customer_id = t.customer_id

inner join只会找所有出现在以上3个table的所有records。如果你需要找出所有顾客,无论有或没有做过任何transaction,你可以改用left join。
回复

使用道具 举报

发表于 19-11-2013 09:47 PM | 显示全部楼层
index 你的 customer_id 呀。
我用Oracle join table 拿1万++record也不过2秒++
回复

使用道具 举报

 楼主| 发表于 16-1-2014 04:53 PM | 显示全部楼层
illusionX 发表于 19-11-2013 09:47 PM
index 你的 customer_id 呀。
我用Oracle join table 拿1万++record也不过2秒++



不是join 的问题是我有太多select 了
回复

使用道具 举报

Follow Us
 楼主| 发表于 16-1-2014 05:09 PM | 显示全部楼层
geekman 发表于 13-11-2013 09:22 AM
建议顾客购买更快的电脑和装备更多的RAM。

我编写的成绩册系统,在运算全校学生成绩时,大型学校(800+学 ...




抱歉迟回复了...我更新了问题...

谢谢你的意见
不过我不觉得是电脑问题毕竟不是很复杂的演算法,人家的软件在P4时代的电脑都能做到

还有像请问是不是从db拿资料出来再用code来处理会比较快?
sorting 资料也好,算法也好?


回复

使用道具 举报

 楼主| 发表于 16-1-2014 05:13 PM | 显示全部楼层
My2ndLovE 发表于 13-11-2013 05:42 PM
请问你是用着什么dbms?
80多个records不可能需要1-2分钟。
我觉得慢的原因是出在你report的那边吧?你有 ...



谢谢你的回复...我更新了问题...

我用MYSQL

也不是report哪里出问题...
就像我更新的问题得到一天的结果需要3秒 X 31天 需要1.5分钟 还没加上generate report的时间


回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 16-1-2014 05:21 PM | 显示全部楼层
有图为证

本帖最后由 pohlee 于 16-1-2014 05:22 PM 编辑

回复

使用道具 举报

发表于 16-1-2014 08:25 PM | 显示全部楼层
pohlee 发表于 16-1-2014 05:09 PM
抱歉迟回复了...我更新了问题...

谢谢你的意见

使用哪种方法视乎数据所需吧,我个人比较习惯把问题分解成几个小部分来处理,所以用code会比较方便。

话说回来,你原先的问题,有没有试过用Group By来做?例如:

  1. SELECT transactions.customer_id, transactions.member_id, COUNT(transactions.transaction_id)
  2. FROM transactions
  3. LEFT JOIN customers ON customers.customer_id = transcations.customer_id
  4. GROUP BY transactions.customer_id, transactions.member_id
  5. WHERE transactions.date BETWEEN date1 AND date2;
复制代码
这样的话Expression并不是那么复杂,应该速度会有所提升吧?记得要Set WHERE clause,这可以大大的减少Server必须搜寻的数据范围。

至于第二个问题,如果上面的你能够使用,那这个问题也能解决了。

回复

使用道具 举报

发表于 17-1-2014 12:45 PM | 显示全部楼层
pohlee 发表于 16-1-2014 05:13 PM
谢谢你的回复...我更新了问题...

我用MYSQL

为什么不直接用GROUP BY 而要用 service.name LIKE...? LIKE 很吃资源的因为要compare很多东西,除非您有做indexing

SELECT COUNT(service.name) FROM [table]
WHERE (condition)
GROUP BY (service.name)
回复

使用道具 举报

发表于 23-1-2014 10:07 PM | 显示全部楼层
跟據你的圖,你的情形應該能以一個query做完.不過速度慢有可能是你講的query問題,可以試看優化你的query.
參考上面幾樓的意見,然後google一下pivot或pivot table.
是學生嗎?
新年快樂


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 6-9-2025 02:54 AM , Processed in 0.296774 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表