优化将字节转换为兆字节然后按desc排序的数据库查询

时间:2014-06-09 08:43:48

标签: sql sql-server performance

我有一张大表,里面有关于我系统中不同文件的信息。

目前文件大小以字节存储,但我需要进行查询,将它们转换为兆字节,然后按这些兆字节进行排序。

由于正在进行的计算,查询非常慢,我想知道是否有一种方法可以优化它以更快地运行?

SELECT
   [DS_ID]
  ,[DS_Blob]
  ,[DS_Ext]
  ,[DS_FileSize] / 1048576 AS 'Size (in MB)'
  ,[DS_CV_ID]
  ,[DS_Filename]
  ,[DS_DataAccess]
FROM 
   [DS_DocumentStorage]
WHERE
   DS_FileSize > 1048576
ORDER BY 'Size (in MB)' DESC

由于

4 个答案:

答案 0 :(得分:1)

我能想到的几个选项:

  1. 添加一个代表Mb大小的列(包含所有额外的存储空间并保持同步问题)。

  2. 使用带有基于函数的索引的“计算列”:

  3. 
        CREATE TABLE DS_DocumentStorage (
            ...
            DS_FileSizeMB AS [DS_FileSize] / 1048576
        );
    
        CREATE INDEX ix_DS_FileSizeMB ON DS_DocumentStorage(DS_FileSizeMB);
    

    N.B。您应该测试执行计划,看看这是否真的可以改善您的情况。

答案 1 :(得分:0)

大于条件意味着需要进行表扫描。这意味着你拥有的任何索引都是无用的。订单也会搞砸你的执行计划。如果无法在sql server外部排序结果,那么我建议你将查询放入索引视图中,因为你无论如何只从1个表中提取数据。

Here是一个链接,您可以在其中了解索引视图。索引视图可确保您的查询执行计划执行索引搜索而不是扫描,这将显着改进查询执行计划并减少从表中提取数据所需的时间。

但话说回来,如果你有一个庞大的数据库(数千万行左右)的数据,那么执行完成仍需要几分钟。

答案 2 :(得分:0)

++如果你只是说'#34;按DS_FileSize desc"顺序排序,这有什么关系?将与" ORDER BY'尺寸(以MB为单位)'完全相同DESC"

答案 3 :(得分:0)

我知道哪件事对你也有用。您可以添加一个存储计算mb结果的列,并提供非聚集索引,如

在其上创建索引,以便更快地获得数据。

ALTER TABLE tablename ADD columnaname AS (QtyAvailable * UnitPrice * 1.35);

CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);

对于带有计算列的alter table: - http://msdn.microsoft.com/en-us/library/ms188300.aspx

索引创建: - http://msdn.microsoft.com/en-in/library/ms190806.aspx

对于计算列的性能检查: - http://msdn.microsoft.com/en-IN/library/ms189292.aspx

您可以使用Index view

例如,

http://www.codeproject.com/Articles/199058/SQL-Server-Indexed-Views-Speed-Up-Your-Select-Quer