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

Hai truy vấn hoàn toàn khác nhau so với 4 triệu bản ghi được thực thi cùng một lúc - một truy vấn sử dụng bạo lực

Tin tưởng trình tối ưu hóa.

Viết truy vấn thể hiện đơn giản nhất những gì bạn đang cố gắng đạt được. Nếu bạn đang gặp vấn đề về hiệu suất với truy vấn đó, sau đó bạn nên xem liệu có bất kỳ chỉ mục nào bị thiếu không. Nhưng bạn vẫn không cần phải rõ ràng làm việc với các chỉ mục này.

Đừng quan tâm đến bản thân bởi những cân nhắc về cách bạn có thể triển khai một tìm kiếm như vậy.

Trong rất trong trường hợp hiếm hoi, bạn có thể cần phải buộc truy vấn sử dụng các chỉ mục cụ thể (thông qua gợi ý), nhưng đây có thể là <0,1% các truy vấn.

Trong các kế hoạch đã đăng của bạn, phiên bản "được tối ưu hóa" của bạn đang quét 2 chỉ mục của bảng Tham số (tôi cho là) ​​của bạn (PK_Params_1, IX_Params_1). Nếu không nhìn thấy các truy vấn, rất khó để biết tại sao điều này lại xảy ra, nhưng nếu bạn so sánh với việc quét một bảng duy nhất với một bảng ("Brute force") và hai, thật dễ dàng để hiểu tại sao thứ hai không hiệu quả hơn.

Tôi nghĩ tôi sẽ thử:

        SELECT      p.ProductID, ptr.[Rank]
        FROM        dbo.SearchItemsGet(@SearchID, NULL) AS si
                    JOIN dbo.ProductDefs AS pd
        ON          pd.ParamTypeID = si.ParamTypeID
                    JOIN dbo.Params AS p
        ON          p.ProductDefID = pd.ProductDefID
                    JOIN dbo.ProductTypesResultsGet(@SearchID) AS ptr
        ON          ptr.ProductTypeID = pd.ProductTypeID

LEFT JOIN Params p_anti
    on p_anti.ProductDefId = pd.ProductDefID and
         (p_anti.ParamLo < si.LowMin or p_anti.ParamHi > si.HiMax)


        WHERE       si.Mode IN (1, 2)

AND p_anti.ProductID is null

        GROUP BY    p.ProductID, ptr.[Rank]

I E. giới thiệu một chương trình chống tham gia loại bỏ kết quả mà bạn không mong muốn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - Tạo XML - Cách đặt Unicode UTF-8

  2. SQL Server tương đương với ORACLE INSTR

  3. Oracle tương đương với hàm IsNull () của SQL Server là gì?

  4. Sự cố tuần tự hóa CLR của C # và SQL Server 2008

  5. Chèn giá trị chuỗi hex vào trường hình ảnh máy chủ sql đang nối thêm 0