使用sql_variant存储数据的性能问题

时间:2011-05-16 16:32:31

标签: sql-server

我有一个Key / Value表我用来存储可以是文本或数字的数据,但没有别的。

在初步测试中,我在将citeria应用于sql_variant列时看到可怕的性能,例如:

SELECT * FROM MY_DATA WHERE  
MY_ENTITY_TYPE = 555
AND CAST(MY_SQL_VARIANT_COLUMN AS NUMERIC) = 2254

所以很明显会出现这样的查询,但我看到的查询时间超过10秒,表中只有几千行。

考虑到我只会存储数字或文本数据,使用varchar(255)列会更合理吗?这样,选择性能应该很快,我只需要选择CAST来将数据转换为正确的数据类型。

2 个答案:

答案 0 :(得分:1)

请原谅我,但键/值表听起来像许多人在某些时候尝试的超级通用数据库(我做过!)并且它根本不能正常工作。

您确定无法预测密钥并定义一个表,其中键是列,行是相关的值吗?

答案 1 :(得分:0)

以下是解决此性能问题的两种方法:

  1. CAST标准值而不是列: SELECT * FROM MY_DATA WHERE
    MY_ENTITY_TYPE = 555 AND MY_SQL_VARIANT_COLUMN = CAST(2254 AS NUMERIC)

  2. 将索引添加到表中的其他列,看看它是否神奇地修复了问题。例如,向MY_ENTITY_TYPE添加索引,尽管没有将标准应用于此列,但它清除了我的示例中的性能问题。

  3. 显然,#1是两者中最好的。