【问题标题】:How do I optimize the following SQL query for performance?如何优化以下 SQL 查询的性能?
【发布时间】:2010-11-11 14:27:22
【问题描述】:

如何优化以下 SQL 查询的性能?

select * from Employee where CNIC = 'some-CNIC-number'

使用别名是否有助于加快速度?

我正在使用 Microsoft SQL Server。

【问题讨论】:

    标签: performance optimization sql


    【解决方案1】:

    如果您告诉我们您使用的是什么 RDBMS 会更好,但是...

    1 - 不要做SELECT *。指定您需要的列。更少的数据 = 更快的查询

    2 - 对于索引,请确保您在 CNIC 上有一个索引。您还希望在主键上有一个良好的聚集索引(最好是 ID 号之类的东西)

    3 - 您将数字放在单引号 ' ' 中,这表明您可能将其作为 varchar 列。如果它始终是 NUMERIC,它应该是 int/bigint 数据类型。这占用的空间更少,检索和索引的速度更快。

    【讨论】:

    • 嗯,很好。 +1 Less data = faster query :)
    • 扩展您的#1,如果 OP 可以删除带有小列列表的“*”(并且取决于数据库,并非所有人都支持这一点),您可以创建一个索引并包含列在查询中使用。这称为覆盖索引,可以加快非聚集索引的使用速度。
    • by "INCLUDE" 我的意思不是要有一个多列索引,而是仍然只在 CNIC 上有一个索引,但是其他列的数据包含在物理索引中,所以它防止对实际表进行回读以获取所需的其他数据,请参阅:covering index
    【解决方案2】:

    CNIC上创建索引:

    CREATE INDEX ix_employee_cnic ON employee (cnic)
    

    【讨论】:

      【解决方案3】:

      首先,我看到此列将用于存储身份证号码,然后您可以将您的库设为int 而不是varcharnvarchar,因为与整数类型相比,搜索会更快到varcharnvarchar

      其次,使用with (no lock),点赞

      select * from Employee with (nolock) where CNIC = 'some-CNIC-number'
      

      这是为了尽量减少死锁的机会。

      【讨论】:

        猜你喜欢
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        相关资源
        最近更新 更多