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

问题描述 投票:0回答:1

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个请求代替它们。

sql sql-server entity-framework optimization
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.