查看: 1939|回复: 11
|
想请教有任何方法提高这种类型 SQL Queries 性能吗? 更新问题
[复制链接]
|
|
简单来说我要用到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 编辑
|
|
|
|
|
|
|
|
发表于 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 了
|
|
|
|
|
|
|
|

楼主 |
发表于 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的时间
|
|
|
|
|
|
|
|

楼主 |
发表于 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来做?例如:
- SELECT transactions.customer_id, transactions.member_id, COUNT(transactions.transaction_id)
- FROM transactions
- LEFT JOIN customers ON customers.customer_id = transcations.customer_id
- GROUP BY transactions.customer_id, transactions.member_id
- 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.
是學生嗎?
新年快樂
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|