我正在 SSMS 中运行 SELECT 查询,需要很长时间才能完成。超过 30 分钟。
SELECT 子句中有一个 Image 列,只要我删除它,查询就会正常运行。
现在我可以看到其他论坛首先声明您不应该使用图像数据类型有几个原因,我同意。但是这个数据库有它(15 年前),我现在无法更改它。此外,该列中有一些相当大的图像 (> 20MB)。
大约有 8000 条记录可供检索。
当图像位于 SELECT 子句中时,有关于如何提高性能的指导吗?索引、 View ……?
例如:
SELECT ID, Title, MyImageColumn
FROM MyTable
最佳答案
这似乎是一个与磁盘 I/O 相关的问题。 SQL Server 从磁盘读取图像的二进制数据,这会影响查询性能(从磁盘读取 8000*5MB 需要时间)。
您可以将包含图像的表移动到更快的磁盘阵列或通过将其移动到新文件组来移动到 SSD 存储。 (http://msdn.microsoft.com/en-us/library/ms175905.aspx) 这可能会给您带来轻微的性能提升。
根据您一次从表中检索的图像的数量和总大小,您应该考虑在一个查询中查询有关图像的信息。之后,当确实有必要时,您应该只查询二进制数据(每个查询一张图像)。
你真的需要一次查询所有记录(带有图像数据)吗?如果没有,则限制您的结果(使用分页来迭代数据库中存储的图像)或仅查询非二进制数据,并在确实需要时查询图像数据(并且可能在您的应用程序中添加某种缓存) .
查询图像或大型二进制数据时,尽量将记录数限制在合理的范围内。
如果您使用的是 SQL Server 2008 或更高版本,则应测试使用 FILESTREAM
是否能提供一定的性能提升。
IMAGE
数据类型已被废弃。尝试将其更改为 VARBINARY(MAX)
并阅读有关 Row-Overflow Considerations
的文章
我知道有人提到您无法将文件移出数据库,但这是您最好的机会和最佳实践。尝试从老板那里获得实现它的时间表。
关于带有 Image 列的 SQL SELECT 语句速度缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25301260/