T-SQL探针残差

时间:2018-07-24 11:12:22

标签: sql-server tsql performance-testing

我正在测试探针残差,将数据类型不匹配的表联接起来,以了解这如何影响性能。在此测试中,我连接了两个表,一个表具有不匹配的数据类型(nvarchar与varchar),另一个表具有匹配的数据类型。我使用的代码:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Repositories\PropertyUpload\PropertyUploadRepository;

class FacadesServiceProviders extends ServiceProvider
{

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('helper', function(PropertyUploadRepositoryInterface $propertyUploadRepository){
            return new \App\Helpers\Helper($propertyUploadRepository);
        });
    }
}

性能存在很大差异。但是,令我完全惊讶的是,使用不匹配的数据类型实际上会更好。

我必须忽略某些东西,但是任何见识都会受到赞赏。

非常感谢!

1 个答案:

答案 0 :(得分:0)

  1. 添加选项(RECOMPILE,MAXDOP 1)以进行清晰的测试
  2. 使用DBCC DROPCLEANBUFFERS测试(从缓冲池中删除所有缓冲区)
  3. 在我的SQL(2016年)中,第一个查询“更快”
  4. 没有MAXDOP = 1的测试:
 INNER JOIN matching type -> NL JOIN
 CPU time = 15251 ms,  elapsed time = 4848 ms.

 INNER JOIN non-matching type -> MERGE JOIN + SORT 
 CPU time = 15889 ms,  elapsed time = 9776 ms.
  1. 使用MAXDOP = 1进行测试
INNER JOIN matching type -> NL JOIN    
CPU time = 8438 ms,  elapsed time = 9307 ms.

INNER JOIN non-matching type -> NL JOIN + sort    
CPU time = 8687 ms,  elapsed time = 10130 ms.

早期版本可能有不同的计划,我希望不匹配的类型获得HASH JOIN和更多的CPU。

p / s Sql Server尝试创建更便宜的计划,以牺牲执行速度为代价来节省资源