PL/SQL 查询效率提升

Posted

技术标签:

【中文标题】PL/SQL 查询效率提升【英文标题】:PL/SQL Query efficiency improvement 【发布时间】:2014-10-29 11:29:01 【问题描述】:

大家好,我希望您能帮助我解决我正在尝试编写的 SQL 查询。我已经完成了我想要的表格,但我必须逐行构建它。这效率不高,当我最终得到 200 行时,这会减慢网站速度。

这是我的表格的样子:

FeedBack Table: 

RatingID |  RATING| TUTORIAL_ID|    TUTORIAL_NAME

5716|   4  |    993|    Test002

5717|   3  |    993|    Test002

5777|   1  |    994|    eClip3

5886|   1  |    994|    eClip3

7127|   4  |    1235|   FTIR001

7128|   4  |    1235|   FTIR001

7169|   3  |    1235|   FTIR001

7170|   2  |    1235|   FTIR001

7131|   4  |    1235|   FTIR001

7187|   3  |    1235|   FTIR001

7132|   3  |    1235|   FTIR001

我想要生成的是一个包含所有唯一教程名称的表格,然后是特定教程被评分的总次数;

1(not useful), 2(somewhat useful), 3(useful), 4(Very Useful)

所以查询应该是:

Tutorial Name | not Useful | Somewhat Useful| Useful| Very Useful

Test002| 0| 0|1|1

eClip3|2|0|0|0

FTIR001| 0| 1| 3| 3

该表格显示在后面带有 C# 的网页上。目前,我在表格中循环查找各个教程名称的列表,然后对于每个剪辑名称,我选择 Count(*) where rating = 1 etc.. 并逐行构建表格。

我真正想知道的是,是否有办法一次性完成所有这些工作。这将大大提高网站的效率,因为我要显示 200 多个教程的数据。

【问题讨论】:

查看 plsql 分组 psoug.org/definition/GROUPING.htm 或者甚至更好的 linq 分组 msdn.microsoft.com/en-us/library/bb545971.aspx 【参考方案1】:
select tutorial_name, 
       sum(case when rating=1 then 1 else 0 end) "not Useful",
       sum(case when rating=2 then 1 else 0 end) "Somewhat Useful",
       sum(case when rating=3 then 1 else 0 end) "Useful",
       sum(case when rating=4 then 1 else 0 end) "Very Useful"
  from feedback
  group by tutorial_name;

是您需要的查询。

【讨论】:

完美,正是我所需要的。非常感谢

以上是关于PL/SQL 查询效率提升的主要内容,如果未能解决你的问题,请参考以下文章

MySQL(Oracle)模糊查询 使用 instr () 替代 like 提升效率

干货|传统关系型数据库查询效率提升

数据量大的表,查寻方式优化,提升查寻效率

MySQL -通过调整索引提升查询效率

MySql采用range分区可提升查询效率

es在大数据面前怎么提升查询效率