【发布时间】:2013-08-29 08:09:22
【问题描述】:
我有一个数据库,其中包含大约 2.500.000 条记录的表。我正在获取大约 150.000 条记录,需要测试 2 个不同的查询。第一个返回 30 秒到 1 分钟之间的结果。但是第二个在 3 到 4 分钟之间做出响应,这很奇怪。唯一的变化是第一个不使用参数,但第二个不使用。我都从 C# 运行。对于安全问题,我想使用带参数的,但我不明白为什么要花这么多时间。任何帮助将不胜感激。
第一个查询:
DECLARE @page INT=3
DECLARE @pagesize INT=300
string sql = "SELECT Col1,Col2,Col3 FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Col1) AS rownumber,Col1,Col2,Col3";
sql += " FROM my_table WHERE Col1 LIKE '" + letter + "%') as somex
WHERE rownumber >= (@page-1)*(@pagesize)";
sql += "AND rownumber <=(@page)*@pagesize;
SELECT COUNT(*) FROM my_table WHERE col1 LIKE '" + letter + "%'";
第二次查询:
DECLARE @page INT=3
DECLARE @pagesize INT=300
DECLARE @starting VARCHAR(10)='be'
string sql = "SELECT Col1,Col2,Col3FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Col1) AS rownumber,Col1,Col2,Col3";
sql += " FROM my_table WHERE Col1 LIKE @letter+'%') as somex
WHERE rownumber >= (@page-1)*(@pagesize)";
sql += "AND rownumber <=(@page)*@pagesize; SELECT COUNT(*)
FROM my_table WHERE col1 LIKE @letter+'%'";
我的服务器是 16GB 内存,4 个真正的 4 个虚拟 CPU,Sata 磁盘。
编辑: Col1 是聚集和非聚集索引。
进度:事实证明,这些查询在另一台服务器上运行良好。但这让我更加困惑。会不会是 SQL Server 的一些设置?
【问题讨论】:
-
听起来像parameter sniffing。
-
除了 GarethD 之外,您还应该: 1- 确保 col1 上有索引 2- 执行 count(col1) 而不是 count(*) 3- 更新表统计信息
-
我编辑了这个问题。 col1 上有聚集索引和非聚集索引。我将 count(*) 更改为 count(col1) 但它根本没有影响。
标签: c# sql sql-server performance