Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 开销来自SQL元素的解析。我不相信会有什么不同_C#_C++_Sql_Sql Server - Fatal编程技术网

C# 开销来自SQL元素的解析。我不相信会有什么不同

C# 开销来自SQL元素的解析。我不相信会有什么不同,c#,c++,sql,sql-server,C#,C++,Sql,Sql Server,如果您真的认为这是一个问题(我不这么认为,但我不负责您正在做的工作…),我建议您尝试构建一个测试用例,使用一些具有实际值和实际大小(可能更大)的表,然后比较计算值和直接获取值的速度(在纯SQL代码中-我假定您可以使用SQL命令行工具,或者一些web界面或其他允许您执行计算的工具)。可能也只返回值的总和 编辑:我写了一些PHP(因为我的机器上已经安装了一个PHP+MySQL环境)。[不,这些不是我的用户名/密码组合-我不会在那样的公共服务器上发布它!] <?php $dbconnect =

如果您真的认为这是一个问题(我不这么认为,但我不负责您正在做的工作…),我建议您尝试构建一个测试用例,使用一些具有实际值和实际大小(可能更大)的表,然后比较计算值和直接获取值的速度(在纯SQL代码中-我假定您可以使用SQL命令行工具,或者一些web界面或其他允许您执行计算的工具)。可能也只返回值的总和

编辑:我写了一些PHP(因为我的机器上已经安装了一个PHP+MySQL环境)。[不,这些不是我的用户名/密码组合-我不会在那样的公共服务器上发布它!]

<?php

$dbconnect = mysql_connect("localhost", "username", "password");
if (!$dbconnect)
{
    die('Could not connect: ' . mysql_error());
}
mysql_select_db("test", $dbconnect) 
    or die ("Couldn't connect to database: " . mysql_error() );

echo "Argv[1]=" . $argv[1] . "\n";


if ($argv[1] == "Create")
{
    $rm = getrandmax();
    for($i = 0; $i < 100000; $i++)
    {
        $a = rand() / $rm;
        $b = rand() / $rm;
        $c = rand() / $rm;
        $d = rand() / $rm;
        $e = rand() / $rm;
        $f = rand() / $rm;
        $sql = "INSERT INTO test1 (id, a, b, c, d, e, f) VALUES (" 
            . $i . 
            ", " .  $a . ", " . $b . ", " . $c . ", " . $d . ", " . $e
            . ", " . $f . ");";
        if (mysql_query($sql, $dbconnect) === false)
        {
            die("Could not add element " . mysql_error());
        }
    }
}

if ($argv[1] == "ExpSumLog")
{
    $sql = "SELECT exp(sum(log(a))) AS a1,
                 exp(sum(log(b))) AS b1,
                 exp(sum(log(c))) AS c1,
                 exp(sum(log(d))) AS d1,
                 exp(sum(log(e))) AS e1
          FROM test1
          GROUP BY e,f,id";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    $sum = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }

    echo "Sum=" . $sum . ", count=" . $count . "\n";
}


if ($argv[1] == "Sum")
{
    $sum = 0;
    $sql = "SELECT sum(a) AS a1,
                 sum(b) AS b1,
                 sum(c) AS c1,
                 sum(d) AS d1,
                 sum(e) AS e1
          FROM test1
          GROUP BY e,f,id";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }

    echo "Sum=" . $sum . ", count=" . $count . "\n";
}

if ($argv[1] == "List")
{
    $sum = 0;
    $sql = "SELECT * FROM test1;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a'];
    }

    echo "Sum=" . $sum . ", count=" . $count . "\n";
}

if ($argv[1] == "SumA")
{
    $sum = 0;
    $sql = "SELECT sum(a) FROM test1;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['sum(a)'];
    }

    echo "Sum=" . $sum . ", count=" . $count . "\n";
}

if ($argv[1] == "ExpSumLogA")
{
    $sum = 0;
    $sql = "SELECT sum(exp(log(a))) AS a1 FROM test1;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }
    echo "Sum=" . $sum . ", count=" . $count . "\n";
}   
?>
如您所见,执行实际计算所需的时间远少于复制所有数据所需的时间。并且,将数据计算为sum(exp(log(a))和sum(a)之间的差异略有不同(但始终不同-对于ExpSumLogA和SumA,每次运行大约慢20-30毫秒)

为了证明数据传输才是重点,我添加了以下四种变体:

if ($argv[1] == "SortedA")
{

    $sum = 0;
    $sql = "SELECT a AS a1 FROM test1 ORDER BY a;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }
    echo "Sum=" . $sum . ", count=" . $count . "\n";
}

if ($argv[1] == "SortedExpLogA")
{

    $sum = 0;
    $sql = "SELECT exp(log(a)) AS a1 FROM test1 ORDER BY a;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }
    echo "Sum=" . $sum . ", count=" . $count . "\n";
}

if ($argv[1] == "UnsortedA")
{

    $sum = 0;
    $sql = "SELECT a AS a1 FROM test1;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }
    echo "Sum=" . $sum . ", count=" . $count . "\n";
}

if ($argv[1] == "UnsortedExpLogA")
{

    $sum = 0;
    $sql = "SELECT exp(log(a)) AS a1 FROM test1;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }
    echo "Sum=" . $sum . ", count=" . $count . "\n";
}
显然,这些变体的运行速度比导出所有数据快,但比“只返回一个值”的版本慢,而且确实如此

Argv[1]=SortedA
Sum=50017.011061375, count=100000

real    0m0.375s
user    0m0.194s
sys 0m0.027s
Argv[1]=SortedExpLogA
Sum=50017.011061375, count=100000

real    0m0.394s
user    0m0.202s
sys 0m0.023s

Argv[1]=UnsortedA
Sum=50017.011061374, count=100000

real    0m0.353s
user    0m0.206s
sys 0m0.018s
Argv[1]=UnsortedExpLogA
Sum=50017.011061374, count=100000

real    0m0.383s
user    0m0.223s
sys 0m0.025s

正如您所看到的,排序所需的时间比未排序所需的时间稍长(预计,如果您必须对10万个项目进行排序,它将增加一些时间),而ExpLog变体比“just return a”稍微慢一点变体。这是相当一致的。

我建议先编写代码,只有当你发现速度是一个问题时才优化。如果你最终需要在SQL之外预计算,那么考虑一个动态C库,或者调用C函数。在你解决核心问题之前,永远不要进行优化。在SQL中很容易实现。我不会切换到C。您说过要将所有行检索到应用程序,对其进行处理,然后将其发送回,SQL实现的当前性能如何?您可以尝试先对此进行调整。我建议先编写代码,只有在您发现速度问题时才进行优化。如果最后需要在SQL外部进行预计算,然后考虑一个动态的C库,或者调用C的函数。在你解决了核心问题之前,不要进行优化。只要它在SQL中很容易命中,我就不会切换到C。你说你要把所有的行检索到应用程序,然后处理它,然后发送它。回到前面,SQL实现的当前性能如何?您可以先尝试调整一下。@LukeMakk:添加了一些基准测试。虽然它们是PHP,但主要时间在MYSQL中,PHP内部组件无论如何都是用C编写的。@LukeMakk:添加了一些基准测试。虽然它们是PHP,但主要时间在MYSQL和PHP内部组件中无论如何,组件都是用C编写的。
if ($argv[1] == "SortedA")
{

    $sum = 0;
    $sql = "SELECT a AS a1 FROM test1 ORDER BY a;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }
    echo "Sum=" . $sum . ", count=" . $count . "\n";
}

if ($argv[1] == "SortedExpLogA")
{

    $sum = 0;
    $sql = "SELECT exp(log(a)) AS a1 FROM test1 ORDER BY a;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }
    echo "Sum=" . $sum . ", count=" . $count . "\n";
}

if ($argv[1] == "UnsortedA")
{

    $sum = 0;
    $sql = "SELECT a AS a1 FROM test1;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }
    echo "Sum=" . $sum . ", count=" . $count . "\n";
}

if ($argv[1] == "UnsortedExpLogA")
{

    $sum = 0;
    $sql = "SELECT exp(log(a)) AS a1 FROM test1;";
    $result = mysql_query($sql, $dbconnect) or die("Failed " . mysql_error());
    $count = 0;
    while($row = mysql_fetch_assoc($result))
    {
        $count++;
        $sum += $row['a1'];
    }
    echo "Sum=" . $sum . ", count=" . $count . "\n";
}
Argv[1]=SortedA
Sum=50017.011061375, count=100000

real    0m0.375s
user    0m0.194s
sys 0m0.027s
Argv[1]=SortedExpLogA
Sum=50017.011061375, count=100000

real    0m0.394s
user    0m0.202s
sys 0m0.023s

Argv[1]=UnsortedA
Sum=50017.011061374, count=100000

real    0m0.353s
user    0m0.206s
sys 0m0.018s
Argv[1]=UnsortedExpLogA
Sum=50017.011061374, count=100000

real    0m0.383s
user    0m0.223s
sys 0m0.025s