Heim Datenbank MySQL-Tutorial SQLServer性能优化之 nolock,大幅提升数据库查询性能

SQLServer性能优化之 nolock,大幅提升数据库查询性能

Jun 07, 2016 pm 03:25 PM
sqlserver 优化 性能 提升

公司数据库随着时间的增长,数据越来越多,查询速度也越来越慢。进数据库看了一下,几十万调的数据,查询起来确实很费时间。 要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑。其实除了index的建立之外,当我们在下SQL Command时,在语法中

  公司数据库随着时间的增长,数据越来越多,查询速度也越来越慢。进数据库看了一下,几十万调的数据,查询起来确实很费时间。

  要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑。其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能。

  不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read,就是读到无效的数据。

  下面对于SQLSERVER的锁争用及nolock,rowlock的原理及使用作一个简单描述:

锁争用的描述

  那些不仅仅使用行级锁的数据库使用一种称为混和锁(lock escalation)的技术来获取较高的性能。除非很明确知道是针对整个数据表,否则这些数据库的做法是开始使用行级锁, 然后随着修改的数据增多,开始使用大范围的锁机制。

  不幸的是,这种混和锁的方法会产生和放大新的问题:死锁。如果两个用户以相反的顺序修改位于不同表的记录,而这两条记录虽然逻辑上不相关, 但是物理上是相邻的,操作就会先引发行锁,然后升级为页面锁。这样, 两个用户都需要对方锁定的东西,就造成了死锁。

例如:

  用户A修改表A的一些记录,引发的页面锁不光锁定正在修改的记录,还会有很多其它记录也会被锁定。

  用户B修改表B的一些记录,引发的页面锁锁定用户A和其它正在修改的数据。

  用户A想修改用户B在表B中锁定(并不一定正在修改的)数据。

  用户B想修改或者仅仅想访问用户A在表A中锁定(并不一定正在修改)的数据。

  为了解决该问题,数据库会经常去检测是否有死锁存在,如果有,就把其中的一个事务撤销,好让另一个事务能顺利完成。一般来说,都是撤销 那个修改数据量少的事务,这样回滚的开销就比较少。使用行级锁的数据库 很少会有这个问题,因为两个用户同时修改同一条记录的可能性极小,而且由于极其偶然的修改数据的顺序而造成的锁也少。

  而且,数据库使用锁超时来避免让用户等待时间过长。查询超时的引入也是为了同样目的。我们可以重新递交那些超时的查询,但是这只会造成数据库的堵塞。如果经常发生超时,说明用户使用SQL Server的方式有问题。正常情况是很少会发生超时的。

  在服务器负载较高的运行环境下,使用混合锁的SQL Server锁机制,表现不会很好。 原因是锁争用(Lock Contention)。锁争用造成死锁和锁等待问题。在一个多用户系统中,很多用户会同时在修改数据库,还有更多的用户在同时访问数据库,随时会产生锁,用户也争先恐后地获取锁以确保自己的操作的正确性,死锁频繁发生,这种情形下,用户的心情可想而知。

  确实,如果只有少量用户,SQL Server不会遇到多少麻烦。内部测试和发布的时候,由于用户较少,也很难发现那些并发问题。但是当激发几百个并发,进行持续不断地INSERT,UPDATE,以及一些 DELETE操作时,如何观察是否有麻烦出现,那时候你就会手忙脚乱地去解锁。

 

锁争用的解决方法

  SQL Server开始是用行级锁的,但是经常会扩大为页面锁和表锁,最终造成死锁。

  即使用户没有修改数据,SQL Server在SELECT的时候也会遇到锁。幸运的是,我们可以通过SQL Server 的两个关键字来手工处理:NOLOCK和ROWLOCK。

它们的使用方法如下:

 

 <span>SELECT</span> <span>COUNT</span><span>(UserID)
  </span><span>FROM</span> Users <span>WITH</span><span> (NOLOCK)
  </span><span>WHERE</span> Username <span>LIKE</span> <span>'</span><span>football</span><span>'</span>
Nach dem Login kopieren

<span>UPDATE</span> Users <span>WITH</span><span> (ROWLOCK)
</span><span>SET</span> Username <span>=</span> <span>'admin</span><span>'</span> <span>WHERE</span> Username <span>=</span> <span>'</span><span>football</span><span>'</span>
Nach dem Login kopieren

NOLOCK的使用

  NOLOCK可以忽略锁,直接从数据库读取数据。这意味着可以避开锁,从而提高性能和扩展性。但同时也意味着代码出错的可能性存在。你可能会读取到运行事务正在处理的无须验证的未递交数据。 这种风险可以量化。

ROWLOCK的使用

  ROWLOCK告诉SQL Server只使用行级锁。ROWLOCK语法可以使用在SELECT,UPDATE和DELETE语句中,不过 我习惯仅仅在UPDATE和DELETE语句中使用。如果在UPDATE语句中有指定的主键,那么就总是会引发行级锁的。但是当SQL Server对几个这种UPDATE进行批处理时,某些数据正好在同一个页面(page),这种情况在当前情况下 是很有可能发生的,这就象在一个目录中,创建文件需要较长的时间,而同时你又在更新这些文件。当页面锁引发后,事情就开始变得糟糕了。而如果在UPDATE或者DELETE时,没有指定主键,数据库当然认为很多数据会收到影响,那样 就会直接引发页面锁,事情同样变得糟糕。

下面写一个例子,来说明一下NOLOCK的作用,这里使用一个有一万多条的数据库来测试,先不用NOLOCK来看一下:

<span>declare</span> <span>@start</span> <span>DATETIME</span><span>;
</span><span>declare</span> <span>@end</span> <span>DATETIME</span><span>;
</span><span>SET</span> <span>@start</span> <span>=</span> <span>getdate</span><span>();
</span><span>select</span> <span>*</span> <span>from</span> Captions_t18<span>;
</span><span>SET</span> <span>@end</span> <span>=</span> <span>getdate</span><span>();
</span><span>select</span> <span>datediff</span>(ms,<span>@start</span>,<span>@end</span>);
Nach dem Login kopieren

这里为了是效果更加明显,使用了Select * ,来看一下执行结果,如下图:

SQLServer性能优化之 nolock,大幅提升数据库查询性能

这里显示的使用时间是34720ms,下面使用NOLOCK来看一下:

<span>declare</span> <span>@start</span> <span>DATETIME</span><span>;
</span><span>declare</span> <span>@end</span> <span>DATETIME</span><span>;
</span><span>SET</span> <span>@start</span> <span>=</span> <span>getdate</span><span>();
</span><span>select</span> <span>*</span> <span>from</span> Captions_t18 <span>with</span><span> (NOLOCK);
</span><span>SET</span> <span>@end</span> <span>=</span> <span>getdate</span><span>();
</span><span>select</span> <span>datediff</span>(ms,<span>@start</span>,<span>@end</span>);
Nach dem Login kopieren

运行结果如下图:

SQLServer性能优化之 nolock,大幅提升数据库查询性能

这次使用的时间是2563ms,差距体现出来了吧。个人感觉时间不应该差这么多,总之性能是提高了不少。大家多多测试看看吧~~

 

参考文章:http://blog.sina.com.cn/s/blog_7034dbe00100ll9n.html

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Leistungsvergleich verschiedener Java-Frameworks Leistungsvergleich verschiedener Java-Frameworks Jun 05, 2024 pm 07:14 PM

Leistungsvergleich verschiedener Java-Frameworks: REST-API-Anforderungsverarbeitung: Vert.x ist am besten, mit einer Anforderungsrate von 2-mal SpringBoot und 3-mal Dropwizard. Datenbankabfrage: HibernateORM von SpringBoot ist besser als ORM von Vert.x und Dropwizard. Caching-Vorgänge: Der Hazelcast-Client von Vert.x ist den Caching-Mechanismen von SpringBoot und Dropwizard überlegen. Geeignetes Framework: Wählen Sie entsprechend den Anwendungsanforderungen. Vert.x eignet sich für leistungsstarke Webdienste, SpringBoot eignet sich für datenintensive Anwendungen und Dropwizard eignet sich für Microservice-Architekturen.

C++-Programmoptimierung: Techniken zur Reduzierung der Zeitkomplexität C++-Programmoptimierung: Techniken zur Reduzierung der Zeitkomplexität Jun 01, 2024 am 11:19 AM

Die Zeitkomplexität misst die Ausführungszeit eines Algorithmus im Verhältnis zur Größe der Eingabe. Zu den Tipps zur Reduzierung der Zeitkomplexität von C++-Programmen gehören: Auswahl geeigneter Container (z. B. Vektor, Liste) zur Optimierung der Datenspeicherung und -verwaltung. Nutzen Sie effiziente Algorithmen wie die schnelle Sortierung, um die Rechenzeit zu verkürzen. Eliminieren Sie mehrere Vorgänge, um Doppelzählungen zu reduzieren. Verwenden Sie bedingte Verzweigungen, um unnötige Berechnungen zu vermeiden. Optimieren Sie die lineare Suche, indem Sie schnellere Algorithmen wie die binäre Suche verwenden.

Wie kann die Leistung von Multithread-Programmen in C++ optimiert werden? Wie kann die Leistung von Multithread-Programmen in C++ optimiert werden? Jun 05, 2024 pm 02:04 PM

Zu den wirksamen Techniken zur Optimierung der C++-Multithread-Leistung gehört die Begrenzung der Anzahl der Threads, um Ressourcenkonflikte zu vermeiden. Verwenden Sie leichte Mutex-Sperren, um Konflikte zu reduzieren. Optimieren Sie den Umfang der Sperre und minimieren Sie die Wartezeit. Verwenden Sie sperrenfreie Datenstrukturen, um die Parallelität zu verbessern. Vermeiden Sie geschäftiges Warten und benachrichtigen Sie Threads über Ereignisse über die Ressourcenverfügbarkeit.

Leistungsvergleich von Java-Frameworks Leistungsvergleich von Java-Frameworks Jun 04, 2024 pm 03:56 PM

Laut Benchmarks sind Quarkus (schneller Start, geringer Speicher) oder Micronaut (TechEmpower ausgezeichnet) für kleine, leistungsstarke Anwendungen die ideale Wahl. SpringBoot eignet sich für große Full-Stack-Anwendungen, weist jedoch etwas langsamere Startzeiten und Speichernutzung auf.

Leistungsvergleich von C++ mit anderen Sprachen Leistungsvergleich von C++ mit anderen Sprachen Jun 01, 2024 pm 10:04 PM

Bei der Entwicklung leistungsstarker Anwendungen übertrifft C++ andere Sprachen, insbesondere bei Mikro-Benchmarks. Bei Makro-Benchmarks können die Komfort- und Optimierungsmechanismen anderer Sprachen wie Java und C# besser abschneiden. In der Praxis schneidet C++ bei der Bildverarbeitung, bei numerischen Berechnungen und bei der Spieleentwicklung gut ab, und die direkte Steuerung der Speicherverwaltung und des Hardwarezugriffs bringt offensichtliche Leistungsvorteile.

Wie gut ist die Leistung von Zufallszahlengeneratoren in Golang? Wie gut ist die Leistung von Zufallszahlengeneratoren in Golang? Jun 01, 2024 pm 09:15 PM

Der beste Weg, Zufallszahlen in Go zu generieren, hängt von der Sicherheitsstufe ab, die Ihre Anwendung erfordert. Geringe Sicherheit: Verwenden Sie das Paket math/rand, um Pseudozufallszahlen zu generieren, die für die meisten Anwendungen geeignet sind. Hohe Sicherheit: Verwenden Sie das Paket crypto/rand, um kryptografisch sichere Zufallsbytes zu generieren, geeignet für Anwendungen, die eine stärkere Zufälligkeit erfordern.

Top 10 Global Digital Virtual Currency Trading Platform Ranking (2025 Autoritative Ranking) Top 10 Global Digital Virtual Currency Trading Platform Ranking (2025 Autoritative Ranking) Mar 06, 2025 pm 04:36 PM

Im Jahr 2025 sind globale digitale Handelsplattformen für virtuelle Währungen sehr wettbewerbsfähig. OKX steht an erster Stelle mit seiner starken technischen Stärke und globalen Betriebsstrategie, und Binance folgt eng mit hoher Liquidität und niedrigen Gebühren. Plattformen wie Gate.io, Coinbase und Kraken stehen mit ihren jeweiligen Vorteilen im Vordergrund. Die Liste umfasst Handelsplattformen wie Huobi, Kucoin, Bitfinex, Crypto.com und Gemini, die jeweils eigene Eigenschaften haben, aber Investitionen sollten vorsichtig sein. Um eine Plattform auszuwählen, müssen Sie Faktoren wie Sicherheit, Liquidität, Gebühren, Benutzererfahrung, Währungsauswahl und Vorschriften für die behördliche Regulierung berücksichtigen und rational investieren

„Black Myth: Wukong ' Die Xbox-Version wurde aufgrund eines „Speicherlecks' verzögert, die Optimierung der PS5-Version ist in Bearbeitung „Black Myth: Wukong ' Die Xbox-Version wurde aufgrund eines „Speicherlecks' verzögert, die Optimierung der PS5-Version ist in Bearbeitung Aug 27, 2024 pm 03:38 PM

Vor kurzem hat „Black Myth: Wukong“ weltweit große Aufmerksamkeit erregt. Die Anzahl der gleichzeitigen Online-Benutzer auf jeder Plattform hat einen neuen Höchststand erreicht. Dieses Spiel hat auf mehreren Plattformen große kommerzielle Erfolge erzielt. Die Xbox-Version von „Black Myth: Wukong“ wurde verschoben. Obwohl „Black Myth: Wukong“ auf PC- und PS5-Plattformen veröffentlicht wurde, gibt es keine konkreten Neuigkeiten zur Xbox-Version. Es wird davon ausgegangen, dass der Beamte bestätigt hat, dass „Black Myth: Wukong“ auf der Xbox-Plattform veröffentlicht wird. Der genaue Starttermin wurde jedoch noch nicht bekannt gegeben. Kürzlich wurde berichtet, dass die Verzögerung der Xbox-Version auf technische Probleme zurückzuführen sei. Laut einem relevanten Blogger erfuhr er aus der Kommunikation mit Entwicklern und „Xbox-Insidern“ während der Gamescom, dass die Xbox-Version von „Black Myth: Wukong“ existiert.

See all articles