| 
| 
查看: 1964|回复: 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来做?例如:
 这样的话Expression并不是那么复杂,应该速度会有所提升吧?记得要Set WHERE clause,这可以大大的减少Server必须搜寻的数据范围。复制代码
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;
 至于第二个问题,如果上面的你能够使用,那这个问题也能解决了。
 
 
 | 
 |  |  |  |
 
|  |  |  
|  |  | 
 |  | 
 
 发表于 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.
 是學生嗎?
 新年快樂
  
 
 
 | 
 |  |  |  |
 
|  |  |  
|  |  |  |  | 
            本周最热论坛帖子 |