如何在不同条件下多次加速查询同一张表?

时间:2019-06-27 04:49:07

标签: sql sql-server entity-framework optimization

EF6,asp mvc内核和SQL Server在后台使用。

我必须对具有不同条件的同一张表进行多次查询,例如

SELECT COUNT(*) FROM Table1 WHERE a = true
SELECT COUNT(*) FROM Table1 WHERE b = true
SELECT COUNT(*) FROM Table1 WHERE a = true || b = true
SELECT a FROM Table1 WHERE b = true

因此有4个查询以不同的条件对Table1进行了查询。我认为结果是我必须阅读整个Table1四次。在伪代码中,它可能看起来像这样。

var res1 = new list();
foreach(var rec in Table1) { // read Table1 first time
  if(rec.a == true) {
    res1.push(rec);
  }
}

var res2 = new list();
foreach(var rec in Table1) { // read Table1 second time
  if(rec.b == true) {
    res2.push(rec);
  }
}

var res3 = new list();
foreach(var rec in Table1) { // read Table1 third time
  if(rec.a == true || rec.b == true) {
    res3.push(rec);
  }
}

var res4 = new list();
foreach(var rec in Table1) { // read Table1 fourth time
  if(rec.b == true) {
    res4.push(rec);
  }
}

我想知道如何只读一次Table1并得到四种不同的结果,就像这样:

var res1 = new List();
var res2 = new List();
var res3 = new List();
var res4 = new list();
foreach(rec in Table1) { // read Table1 first time
    if(a == true) {
        res1.push(rec);
    }
    if(b == true) {
        res2.push(rec);
    }
    if(a == true || b == true) {
        res3.push(rec);
    }
    if(b == true) {
        res4.push(rec);
    }
}  

还有一个挑战,那就是那些查询是动态sql,我的意思是a = trueb = truea = true || b = true存储在数据库中。查询以这种方式运行:

string query = "SELECT Count(*) FROM Table1 WHERE" + condition;
var count = ExecuteSql(query);

上面的示例已简化,但实际上所有查询都被拆分并存储在数据库中。

PS。实际上,我想加快页面速度,它向服务器发出30-40个请求,每个请求都是对同一张表的查询。我想如果我可以用一个请求而不是40个请求代替它们。

1 个答案:

答案 0 :(得分:3)

您可以仅通过单个查询使用条件聚合:

SELECT
    COUNT(CASE WHEN a = true THEN 1 END) AS cnt_a,
    COUNT(CASE WHEN b = true THEN 1 END) AS cnt_b,
    COUNT(CASE WHEN a = true OR b = true THEN 1 END) AS cnt_a_b
FROM Table1;

这会将全表扫描的次数从3减少到1。而且,还将有可能将往返数据库的往返次数从3减少到1。