与直接声明相比,准备声明非常缓慢

时间:2016-02-01 08:30:07

标签: sql-server jmeter prepared-statement

我正在对SQL Server数据库进行负载测试。我测试的表包含大约8亿条记录。我使用Jmeter JDBC请求来执行测试。

我正在运行类似于以下的查询:

select column1, column2, column3, column4 from table_name where table_key='32CharString'

此处table_key是表格中的主键,长度为varchar(32)

在Jmeter JDBC请求中,如果我对table_key进行硬编码,则查询将以 ~170毫秒运行。

select column1, column2, column3, column4 from table_name
where table_key='1234567890abcdef1234567890abcdef';

相反,如果我使用预准备语句将其作为参数传递给同一查询,则查询将在 900+秒中成功执行。

select column1, column2, column3, column4 from table_name where table_key=?

Parameter = 1234567890abcdef1234567890abcdef Type = varchar

我无法弄清楚查询执行中有多大的时差。请提供一些指示

1 个答案:

答案 0 :(得分:0)

“参数= 1234567890abcdef1234567890abcdef Type = varchar”对我来说似乎很可疑。具体来说,“varchar(<missing length here>)”。我的理论是它被参数化为更广泛的varchar类型(比如varchar(300)),SQL Server正在执行以下“select <col list> from table_name where cast(table_key as varchar(300)) = ?”。对于SQL Server来说,这意味着它必须触及表中的每一行。

为了确认我的理论,您可以查看您的临时和准备好的陈述的执行计划。如果我是对的,你应该在你的临时计划中看到一个搜索,并在准备好的声明中进行扫描。此外,我认为你还会在准备好的语句中看到一个计算标量操作,用于上转换为语句准备选择的任何数据类型。