小编Der*_*rts的帖子

SQL TOP 5000比普通查询更快,结果行少于5000?

我注意到一些奇怪的行为:

运行此查询:

SELECT TOP 5000  t1.f1,t1.f2,t1.f3 
FROM t1
JOIN t2 on t1.f1 = t2.f1
WHERE t2.f1 IS NOT NULL AND (t1.f5 != t2.f3)
Run Code Online (Sandbox Code Playgroud)

结果在2秒内3447行.

运行这个:

SELECT t1.f1,t1.f2,t1.f3 
FROM t1
JOIN t2 on t1.f1 = t2.f1
WHERE t2.f1 IS NOT NULL AND (t1.f5 != t2.f3)
Run Code Online (Sandbox Code Playgroud)

永远运行直到我停止它(至少120分钟!!).

t1t2保存约500k记录.

我总是认为TOP如果总行数低于该数字,则该声明无关紧要,但是,似乎存在非常显着的差异.这是正常的(如果是这样,为什么)或者这只是一个侥幸?

编辑:

按照要求:

T1:

CREATE TABLE [dbo].[t1](
    [f1] [int] NOT NULL,
    [f2] [varchar](10) NULL,
    [f3] [varchar](4) NULL,
    [f4] [int] NOT NULL,
    [f5] [varchar](max) NULL,
 CONSTRAINT [PK_t1] PRIMARY KEY …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server

14
推荐指数
1
解决办法
3210
查看次数

为什么UNION比OR语句更快

我有一个问题,我需要找到具有与值匹配的测量值的记录,或者根本没有测量值的记录.我用三种或四种不同的方法解决了这个问题,使用JOINs,使用NOT IN和使用NOT EXISTS.但是,查询最终每次都非常慢.然后我尝试将查询分成两部分,它们都运行得非常快(三秒钟).但是使用查询OR需要花费超过五分钟.

阅读SO我尝试过UNION,这非常快,但对我正在使用的脚本非常不方便.

所以有两个问题:

  1. 为什么UNION这么快?(或者为什么OR这么慢)?
  2. 有什么方法可以强制MSSQL使用不同的方法来 OR快速发表声明吗?

sql sql-server union

8
推荐指数
2
解决办法
1万
查看次数

记录在PDO mssql事务循环中消失

我有以下代码(或多或少)导入从500.000到4.000.000行的任何地方:

$sSql = "Insert into table (a,b,c) VALUES(?,?,?)"
$oSQLStmnt = $pdo->prepare($sSql);
$oSQLStmnt->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
if (!$oSQLStmnt) {
    echo $pdo->errorInfo(); // Handle errors
}
$pdo->beginTransaction();
$iLineCounter = 1;
while (($sLine = fgets ($oCSV, 8000)) !== FALSE) {
      $aLine = explode('|', $sLine); //Fgetscsv did not work properly 
       if ($iLineCounter % 100 == 0) {
            lo("Inserting row " . $iLineCounter);
            $pdo->commit();
            sleep(0.15);
            $pdo->beginTransaction();
       }
       try {
            $oSQLStmnt->execute($aLine);
            $iSuccesulInserts++;
       }
       catch (exception $e) {
            print_r($e);
            $iFailedInserts++;
       }

       $iLineCounter++;
}
$pdo->commit();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我每100行执行一次提交,甚至还添加了一些睡眠.我曾经每25.000行只运行一次提交,我没有使用任何睡眠.但是,有一次,我发现我丢失了记录.我开始玩这些设置(睡眠和行数).这样我将丢失记录的数量从50.000减少到大约100.但我仍然缺少记录!他们要去哪?我知道SQL没问题,因为我遇到错误时会立即收到错误.

我以为我可以在交易过程中堆叠很多插入?调用beginTransaction会有问题吗?

更新:

恩惠结束了,我不得不奖励它.谢谢大家的答案.或者实际上是提示,因为没有人真正回答过我的问题.我并不是要求解决方法,尽管您的建议非常受欢迎.得到赏金的答案是因为它最接近实际回答我的问题.不幸的是它没有用.

目前我正在使用CSV批量导入,工作正常,但如果有人有任何其他提示来解决此问题,请告诉我.因为我更喜欢使用我的原始方法.

php sql sql-server pdo transactions

6
推荐指数
1
解决办法
890
查看次数

如何检查图像是否可见?

下面的代码可以检查图像是否可见.

$('#div1 img:visible')
Run Code Online (Sandbox Code Playgroud)

选择所有图像后代,并:

$('#div1 > img:visible')
Run Code Online (Sandbox Code Playgroud)

我只需要知道,当我迭代像dgImages $("#dgImages] img").each(function () {}这样的容器中的每个图像时,我如何确定图像是否可见?我能写点什么if($(this:visible)){//Do something}吗?谢谢.

jquery

2
推荐指数
2
解决办法
9879
查看次数

标签 统计

sql ×3

sql-server ×3

jquery ×1

pdo ×1

php ×1

t-sql ×1

transactions ×1

union ×1