def smart_insert(cls, engine_or_session, data, minimal_size=5, op_counter=0):
        """
        An optimized Insert strategy.

        :return: number of insertion operation been executed. Usually it is
            greatly smaller than ``len(data)``.

        **中文文档**

        在Insert中, 如果已经预知不会出现IntegrityError, 那么使用Bulk Insert的速度要
        远远快于逐条Insert。而如果无法预知, 那么我们采用如下策略:

        1. 尝试Bulk Insert, Bulk Insert由于在结束前不Commit, 所以速度很快。
        2. 如果失败了, 那么对数据的条数开平方根, 进行分包, 然后对每个包重复该逻辑。
        3. 若还是尝试失败, 则继续分包, 当分包的大小小于一定数量时, 则使用逐条插入。
          直到成功为止。

        该Insert策略在内存上需要额外的 sqrt(nbytes) 的开销, 跟原数据相比体积很小。
        但时间上是各种情况下平均最优的。
        """
        ses, auto_close = ensure_session(engine_or_session)

        if isinstance(data, list):
            # 首先进行尝试bulk insert
            try:
                ses.add_all(data)
                ses.commit()
                op_counter += 1
            # 失败了
            except (IntegrityError, FlushError):
                ses.rollback()
                # 分析数据量
                n = len(data)
                # 如果数据条数多于一定数量
                if n >= minimal_size ** 2:
                    # 则进行分包
                    n_chunk = math.floor(math.sqrt(n))
                    for chunk in grouper_list(data, n_chunk):
                        op_counter = cls.smart_insert(
                            ses, chunk, minimal_size, op_counter)
                # 否则则一条条地逐条插入
                else:
                    for obj in data:
                        try:
                            ses.add(obj)
                            ses.commit()
                            op_counter += 1
                        except (IntegrityError, FlushError):
                            ses.rollback()
        else:
            try:
                ses.add(data)
                ses.commit()
            except (IntegrityError, FlushError):
                ses.rollback()

        if auto_close:
            ses.close()

        return op_counter