我正在对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
我无法弄清楚查询执行中有多大的时差。请提供一些指示
答案 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来说,这意味着它必须触及表中的每一行。
为了确认我的理论,您可以查看您的临时和准备好的陈述的执行计划。如果我是对的,你应该在你的临时计划中看到一个搜索,并在准备好的声明中进行扫描。此外,我认为你还会在准备好的语句中看到一个计算标量操作,用于上转换为语句准备选择的任何数据类型。