Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Phân trang trong SQL - Vấn đề về hiệu suất

Tôi luôn kiểm tra lượng dữ liệu mà tôi đang truy cập trong truy vấn và cố gắng loại bỏ các cột cũng như các hàng không cần thiết. truy vấn hiệu suất chậm có thể là do bạn thực hiện “Chọn *”. Chọn tất cả các cột từ bảng không cho phép đi kèm với kế hoạch Thực thi tốt. Hãy kiểm tra xem bạn có chỉ cần các cột đã chọn và đảm bảo rằng bạn có chỉ mục bao trùm chính xác trên Đơn đặt hàng trong bảng.

Vì hàm SKIPP hoặc OFFSET rõ ràng không có sẵn trong phiên bản SQL 2008, chúng ta cần tạo một hàm và chúng ta có thể tạo bằng INNER JOIN. Trong một truy vấn, trước tiên chúng ta sẽ tạo ID bằng OrderDate và không có gì khác trong truy vấn đó. trong truy vấn thứ hai nhưng ở đây chúng tôi cũng chọn một số cột quan tâm khác từ bảng ORDER hoặc ALL nếu bạn cần cột TẤT CẢ. những gì được yêu cầu. Hãy thử mã này.

    SELECT q2.*
    FROM
    (
        SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, OrderDate
        FROM      Orders
        WHERE     OrderDate >= '1980-01-01'
    )q1
    INNER JOIN 
    (
        SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
        FROM      Orders
        WHERE     OrderDate >= '1980-01-01'
    )q2
        ON q1.RowNum=q2.RowNum AND q1.OrderDate=q2.OrderDate AND q1.rownum BETWEEN 30000 AND 30020
    IF object_id('TestSelect','u') IS NOT NULL
        DROP TABLE TestSelect
    GO
    CREATE TABLE TestSelect
    (
        OrderDate   DATETIME2(2)
    )
    GO

    DECLARE @i bigint=1, @dt DATETIME2(2)='01/01/1700'
    WHILE @I<=2000000
    BEGIN

        IF @i%15 = 0
            SELECT @DT = DATEADD(DAY,1,@dt)

        INSERT INTO dbo.TestSelect( OrderDate )
        SELECT @dt

        SELECT @[email protected]+1
    END
    SELECT q2.*
    FROM
    (
        SELECT  ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum 
                ,OrderDate
        FROM TestSelect
        WHERE OrderDate >= '1700-01-01'
    )q1
    INNER JOIN
    (
        SELECT  ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum 
                ,*
        FROM TestSelect
        WHERE OrderDate >= '1700-01-01'
    )q2
        ON q1.RowNum=q2.RowNum 
        AND q1.OrderDate=q2.OrderDate 
        AND q1.RowNum BETWEEN 50000 AND 50010



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đang đợi localhost, mãi mãi!

  2. INSTR () Tương đương trong SQL Server

  3. Công cụ cơ sở dữ liệu xử lý chèn đồng thời như thế nào?

  4. Chọn cột được tính toán của SQL Server từ một bảng khác

  5. Cách sao chép cơ sở dữ liệu máy chủ sql từ máy chủ này sang máy chủ khác mà không cần bất kỳ bản sao lưu nào