在我们的 SQL Server 上,查询需要 20 毫秒。如果我查看执行计划,会发现使用了并行性、哈希匹配、位图创建......很多带有两个指向左侧的箭头的图像。
在运行我们产品的客户的 SQL Server 上,相同的查询需要 2500 毫秒。如果我查看他们的执行计划,没有使用并行性或任何带箭头的东西……
我已经搜索了好几天,不知道为什么查询在他们的 SQL 服务器上运行得这么慢。
- 并行性和所有其他东西是否可以在其 SQL 服务器上配置?
- 那么如何配置它呢?
- 使用并行性有哪些危险?
另一件奇怪的事情是,在我们的服务器上,查询需要大约 1200 次读取和 0 次写入。在他们的 SQL 服务器上,它需要 150 万次读取和大约 1500 次写入。为什么在完成读取查询后会有这些写入?
答案1
- 并行性取决于服务器核心。没有多核就无法并行化。那么,硬件是否相同?;)
- 您可以配置最大并行度,以便不会有一个用户阻塞整个服务器,但没有最小值。
- 危险吗?好吧,除了有时在某些版本的 SQL Server 中会出现严重错误(并且比没有它时慢很多 - 操作:修补您的 SQL Server)之外,它实际上会减少执行的并发语句的数量,因为一条语句会使用更多的系统资源。
在他们的 SQL Server 上,需要 150 万次读取和约 1500 次写入。为什么在完成读取查询后还要进行这些写入?
如果您查看查询计划,您很可能会发现它不是纯读取,因为它涉及一些临时对象,显然这些对象正在被写入。排序、Paralellsim 合并都可能导致临时对象中的写入操作。
您可以看到执行计划的每一步的读/写。
在运行我们产品的客户的 SQL Server 上,相同的查询需要 2500 毫秒。如果我查看他们的执行计划,没有使用并行性或任何带箭头的东西……
你检查过显而易见的东西吗?糟糕的硬件 - 糟糕的 CPU(不太可能)、内存不足和完全超载的 IO 子系统?如今,许多人都虚拟化 SQL 服务器,不知何故,他们为了节省开支而忘记了自己的想法,在下面放置了一个糟糕的 IO 子系统,因此你的 SQL 服务器会慢很多 - 因为磁盘布局很糟糕。
我必须查看并比较这两个执行计划(您可以将屏幕截图上传到某处吗?或者最好上传导出的计划,以便我可以将它们加载到企业管理器中)。